Docs 菜单
Docs 主页
/ /
Atlas Device SDKs
/ /

冻结架构 - Kotlin 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 .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"})
}
}

重要

Flows API需要 Kotlinx 协程

要在Kotlin Multiplatform项目中使用 Flows API ,请安装 kotlinx.coroutines 库。

就像在其他Realm SDK 中一样,写入事务会隐式将您的域提升到磁盘上存储的最新数据版本。

提示

另请参阅:

有关通知的更多信息,请参阅React变更。

默认, Realm对象仍为延迟加载。 这允许您查询大型对象集合,而无需从磁盘读取大量数据。 这也意味着首次访问权限对象的字段将始终返回最新的数据。

后退

Realm