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


# はじめに

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

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




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


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


# #1 NewProject

![](https://i.imgur.com/6XweeNS.png)

KMM Applicationを選ぶ

![](https://i.imgur.com/hoR8SKe.png)

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

# #2 Gradleの設定


```kotlin:/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
    }
}
```


```kotlin:/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のみにしておきます。

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

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

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

# #3 

やっとですね。

```kotlin:/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
    }
}
```

<img src=https://i.imgur.com/GOPjo20.png width = 550/>

`todo2titleString`ですが、Android側のコードで直接titleが取得できなかったのでこっちで変換してます。ﾀﾞﾚｶｵｼｴﾃ

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

# #4 Android側の実装


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

val todos = todoModel.fetchTodos()
Log.d("aaaaa", todoModel.todo2titleString(todos.first()))
```
簡単ですね。

# #5 iOS側の実装



```swift:/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

<!-- 高校行きたくない。 -->