冻结架构 - Kotlin SDK
Atlas Device SDK 已弃用。 有关详细信息,请参阅弃用页面。
与其他Realm SDK 不同, Kotlin SDK不提供与根本的数据同时更新的活动对象和集合。 相反, Kotlin SDK只处理可以在线程之间安全传递的冻结对象。
使用冻结对象
由于当 Realm 中的数据发生变化时,冻结对象不会自动更新,因此它们的工作方式与您在其他 Realm SDK 中可能使用的活动对象略有不同。
访问冻结对象的实时版本
要更新或删除对象,它们必须是活动的。 您可以在ACID 事务中使用 mutableRealm.findLatest()将冻结对象转换为活动对象。 活动对象只能在写入或writeBlocking闭包内的写事务(write transaction)内部访问。
当写事务(write transaction)完成时,从写入闭包返回的对象将成为冻结对象。
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) } } }
提示
您可以使用 isFrozen() 方法检查对象是否冻结。
线程安全 Realm
Realm类不再有线程限制,因此您可以在多个线程之间股票单个域 。 您不再需要通过调用Realm .close()来显式处理域生命周期。
访问变更
要访问权限对对象和集合的更改,请使用 协程 和 Flow 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"}) } }
就像在其他Realm SDK 中一样,写入事务会隐式将您的域提升到磁盘上存储的最新数据版本。
延迟加载
默认, Realm对象仍为延迟加载。 这允许您查询大型对象集合,而无需从磁盘读取大量数据。 这也意味着首次访问权限对象的字段将始终返回最新的数据。