1
Help us understand the problem. What are the problem?

posted at

updated at

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

はじめに

主は今回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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
1
Help us understand the problem. What are the problem?