1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

KMMに対応したRealmを使ってみた!

Last updated at Posted at 2021-03-29

はじめに

主は今回Kotlin, SwiftUIを初めて触ったので間違ってたら申し訳ないです。現時点では動くのでヨシッ!

あと今はまだx86_64アーティファクトのみの対応なので、エミュで試す場合は注意←ハマった。

AndroidStudioにKMMのプラグインとかもろもろ入ってる前提で話します。

Githubに上げてるのでよかったらどうぞ!
https://github.com/hirossan4049/KMMRealmSample

#1 NewProject

KMM Applicationを選ぶ

Android Application NameとiOS Application Nameは好きな名前でも大丈夫ですが、この記事はandroidApp iosApp として進めます。

#2 Gradleの設定

/build.gradle.kts
buildscript {
    repositories {
        gradlePluginPortal()
        jcenter()
        google()
        mavenCentral()

        maven(url = "http://oss.jfrog.org/artifactory/oss-snapshot-local") // Add
    }
    dependencies {
        classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:1.4.30") // Fix
        classpath("com.android.tools.build:gradle:4.0.1")
        classpath("io.realm.kotlin:plugin-gradle:0.0.1-SNAPSHOT") // Add
    }
}

allprojects {
    repositories {
        google()
        jcenter()
        mavenCentral()
        maven(url = "http://oss.jfrog.org/artifactory/oss-snapshot-local") // Add
    }
}
/shared/build.gradle.kts
...
plugins {
    kotlin("multiplatform")
    id("com.android.library")

    id("realm-kotlin") // Add
}

kotlin {
    android()
    ios {
        binaries {
            framework {
                baseName = "shared"
            }
        }
    }
    sourceSets {
        val commonMain by getting {
            dependencies {
                implementation("io.realm.kotlin:library:0.0.1-SNAPSHOT") // Add
            }
        }
        val commonTest by getting {
        ...

書けたらSyncしときましょう。

#2 Modelを書く

サンプルとして、シンプルなTodoアプリを作りたいと思います。
今回は、Realmの全体像を把握するだけなのでtitleのみにしておきます。

/shared/commonMain/…/Todo.kt
class Todo: RealmObject {
    var title: String = "untitled"
//    var isDone: Boolean = false
}

その下にスキーマを定義しておきます。

/shared/commonMain/…/Todo.kt
@RealmModule(Todo::class)
class Entities

#3

やっとですね。

/shared/commonMain/…/TodoModel.kt
import io.realm.Realm

class TodoModel {
    private val realm: Realm by lazy {
        val configuration = RealmConfiguration.Builder()
            .schema(Entities())
            .build()

        Realm.open(configuration)
    }
    
    fun addTodo(title: String): Todo {
        realm.beginTransaction()
        var presitedTodo = realm.create(Todo::class).apply {
            this.title = title
        }
        realm.commitTransaction()
        return presitedTodo
    }

    fun deleteTodo(todo: Todo) {
        realm.beginTransaction()
        Realm.delete(todo)
        realm.commitTransaction()
    }

    fun fetchTodos(): List<Todo> {
        return realm.objects(Todo::class)
    }

    // FIXME Android compile error
    fun todo2titleString(todo: Todo): String {
        return todo.title
    }
}

todo2titleStringですが、Android側のコードで直接titleが取得できなかったのでこっちで変換してます。ダレカオシエテ

ここでエラーでないかビルドすることをおすすめします。

#4 Android側の実装

/androidApp/…/MainActivity.kt
val todoModel = TodoModel()
todoModel.addTodo("きなこもち")

val todos = todoModel.fetchTodos()
Log.d("aaaaa", todoModel.todo2titleString(todos.first()))

簡単ですね。

#5 iOS側の実装

/iosApp/…/ContentView.swift
struct ContentView: View {
    let todoModel = TodoModel() // Add
    var body: some View {
        Text(todoModel.addTodo(title: "抹茶もち").title) // Add
//         Text(todoModel.fetchTodos()[0].title)
    }
}

あとは好きなように実装していくだけです!お疲れさまでした!

最後に

Githubに上げてるのでよかったらどうぞ
https://github.com/hirossan4049/KMMRealmSample

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?