凍結されたアーキテクチャ - Kotlin SDK
他の Realm SDK とは異なり、 Kotlin SDK は、基礎となるデータと同時に更新されるライブオブジェクトとコレクションを提供しません。 代わりに、 Kotlin SDK は、スレッド間で安全に渡される固定オブジェクトのみで動作します。
凍結されたオブジェクトとの連携
固定オブジェクトは、Realm 内のデータが変更されても自動的に更新されないため、他の Realm SDK で使用したライブ オブジェクトとは動作が若干異なります。
凍結されたオブジェクトのライブ バージョンへのアクセス
オブジェクトを更新または削除するには、ライブ状態である必要があります。 MutableRealm.findLast()を使用して、トランザクション内で固定オブジェクトをライブ オブジェクトに変換できます。 ライブオブジェクトには、書込み ( write ) またはwriteBlocking 句内の書込みトランザクション (write transaction) 内でのみアクセスできます。
書込み (write) トランザクションが完了すると、書込み (write) クローニングから返されたオブジェクトは固定オブジェクトになります。
val sample: Sample? = realm.query<Sample>() .first().find() // delete one object synchronously realm.writeBlocking { if (sample != null) { findLatest(sample) ?.also { delete(it) } } } // delete a query result asynchronously GlobalScope.launch { realm.write { query<Sample>() .first() .find() ?.also { delete(it) } } }
Tip
isFrozen()メソッドを使用して、オブジェクトが固定されているかどうかを確認できます。
スレッドセーフ Realm
Realmクラスはスレッド定義されなくなったため、複数のスレッドで 1 つの Realm を共有できます。 You no longer need to handle the realm lifecycle explicitly with calls to Realm.close().
アクセス権の変更
オブジェクトとコレクションの変更にアクセスするには、 コルーチン を使用します。 および フローAPI 。変更はスレッドセーフであるため、どのコンテキストからでも変更にアクセスできます。通知は専用の内部通知スレッドで処理されます。凍結されたオブジェクトは変更リスナーをサポートするようになりました。
val config = RealmConfiguration.Builder(schema = setOf(Task::class)) .build() val realm = Realm.open(config) // fetch objects from a realm as Flowables CoroutineScope(Dispatchers.Main).launch { val flow: Flow<ResultsChange<Task>> = realm.query<Task>().asFlow() flow.collect { task -> Log.v("Task: $task") } } // write an object to the realm in a coroutine CoroutineScope(Dispatchers.Main).launch { realm.write { copyToRealm(Task().apply { name = "my task"; status = "Open"}) } }
重要
Flows API には Kotlinx コルーチンが必要
Kotlin マルチプラットフォーム プロジェクトで Flows API を使用するには、 kotlinx . コルーチンを ライブラリ。
他の Realm SDK と同様に、書込みトランザクション (write transaction) は、Realm をディスクに保存されているデータの最新バージョンに暗黙的に先行させます。
遅延ロード
Realm オブジェクトはデフォルトで遅延ロードされます。 これにより、ディスクから大量のデータを読み込まずに、オブジェクトの大規模なコレクションをクエリできます。 つまり、 オブジェクトのフィールドへの最初のアクセスは常に最新データを返します。