はじめに
主は今回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の設定
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
}
}
...
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のみにしておきます。
class Todo: RealmObject {
var title: String = "untitled"
// var isDone: Boolean = false
}
その下にスキーマを定義しておきます。
@RealmModule(Todo::class)
class Entities
#3
やっとですね。
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側の実装
val todoModel = TodoModel()
todoModel.addTodo("きなこもち")
val todos = todoModel.fetchTodos()
Log.d("aaaaa", todoModel.todo2titleString(todos.first()))
簡単ですね。
#5 iOS側の実装
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