注意
什么是 Kotlin SDK?
Kotlin SDK 是完全使用 Kotlin 编程语言构建的全新 Realm 客户端 SDK。Kotlin SDK 使用与 Java SDK 完全不同的代码库,专为利用 Kotlin 语言功能(如协程和挂起函数)而设计。Java SDK 还支持其中一些功能以及用 Kotlin 编写的 Android 应用程序。但 Kotlin SDK 比 Java SDK 更符合 Kotlin 习惯。
Overview
Java SDK 和 Kotlin SDK 在很多方面有所不同。在本页面中,您将发现大多数 SDK 不同之处的高级比较。
Kotlin SDK 架构
Java SDK 提供了活动对象、查询和域,这些对象、查询和领域会在底层数据发生变化时自动更新。Kotlin SDK 仍然在写事务中提供此活动接口,但在其他事务中会依赖新的冻结架构,该架构降低了 Realm 对象的处理难度。以下是 Java SDK 架构与 Kotlin SDK 架构的一些主要区别:
默认已冻结:现在所有对象都已冻结。与活动对象不同,冻结对象在数据库写入后不会自动更新。您仍然可以在写事务中访问活动对象,但将活动对象传递出写入事务会冻结该对象。
线程安全性:所有 Realm 实例、对象、查询结果和集合现在都可以跨线程传输。
Singleton :现在每个域只需要一个实例。 无需在单个线程上打开和关闭 Realm。
打开域
Java SDK 会自动检测应用程序中定义的 Realm 对象模型,并在打开的 Realm 模式中使用所有这些对象模型,除非您另外指定。Kotlin SDK 要求您手动指定要在 Realm 模式中使用的 Realm 对象模型。 此外:
Kotlin SDK 不提供在应用程序中设置和访问默认 Realm 的功能。 由于您现在可以跨线程共享 Realm、对象和结果,因此您可以改为依赖全局单例。
Java SDK 使用
RealmConfiguration.Builder().build()
生成RealmConfiguration
的实例。 对于 Kotlin SDK,请使用RealmConfiguration.create() 伴随方法RealmConfiguration
。Java SDK 使用静态
Realm.getInstance()
方法打开具有给定配置的 Realm。 使用 Kotlin SDK,请改用静态Realm.open()
方法。
|
|
或者,使用 RealmConfiguration.Builder 进一步自定义配置:
val config = RealmConfiguration.Builder( setOf(Frog::class, Sample::class)) .name(REALM_NAME) .deleteRealmIfMigrationNeeded() .directory(PATH) .encryptionKey(KEY) .build() val realm = Realm.open(config) Log.v("Successfully opened realm:" + realm.configuration.name )
Realm 对象模型
在 Java SDK 中,您可以通过以下两种方式之一来声明 Realm 对象模型:
扩展
RealmObject
实施
RealmModel
Kotlin SDK 改用 RealmObject
接口中的默认方法。对于 Kotlin SDK,从 RealmObject
继承以声明 Realm 对象模型。对于具有特殊属性的字段,如忽略的字段、主键和索引,注释的工作方式与 Java 中的相同。
|
|
提示
关系
Java 和 Kotlin SDK 都通过 Realm 对象字段声明关系:
一对一
|
|
一对多
使用 Java SDK,您可以定义与RealmList
类型字段的一对多关系。 Kotlin SDK 仍然使用RealmList
类型的字段,但您应使用realmListOf()伴随方法实例化RealmList
实例。
|
|
模式类型
对于 Java SDK,您需要使用 @Required
注释使基元列表在 Realm 对象模型中不可为空。Kotlin SDK 默认使基元列表不可为空。使用 ?
操作符,使基元列表可为空。
|
|
写入
Kotlin SDK 为写入 Realm 的方法引入了新名称。
异步
使用 Java SDK,您可以异步写入具有 realm.executeTransactionAsync()
的域。 Kotlin SDK 改用挂起函数 realm.write() 。
|
|
同步
使用 Java SDK,您可以同步写入具有realm.executeTransaction()
的 Realm。 Kotlin SDK 使用realm.writeBlocking():
|
|
查询
Java SDK 中的查询与 Kotlin SDK 中的查询有几处不同:
借助 Java SDK,您可以使用流式接口或 Realm 查询语言(RQL) 查询域中的对象。Kotlin SDK 仅使用 RQL。
Java SDK 使用
realm.where()
来查询域,而 Kotlin SDK 使用realm.query()。借助Java SDK,您可以使用
realmQuery.findAllAsync()
和realmQuery.findFirstAsync()
进行异步查询。在Kotlin SDK中,使用 realmQuery.asFlow() 进行异步查询。获得结果流后,您可以收集 结果。借助 Java SDK,您可以使用
realmQuery.findAll()
和realmQuery.findFirst()
进行同步查询。 在 Kotlin SDK 中,使用realmQuery.find() 进行同步查询。
筛选器
|
|
排序、去重和限制
|
|
删除
在这两个 SDK 中,您只能删除活动对象。 Kotlin SDK 提供了mutableRealm.findLatest() 访问任何冻结对象的活动版本。 在写事务中,您可以直接查询和删除活动对象,而无需使用findLatest()
。
|
|
通知
在这两个 SDK 中,您都可以订阅结果集合的变化。借助 Java SDK,只要域结果发生变化,您就可以通过以下接口收到通知:
realmResults.addChangeListener()
RxJava,通过
asFlowable()
Kotlin 扩展,带有
toFlow()
Kotlin SDK会用 realmQuery.asFlow() 替换所有这些选项。获得结果流后,您可以调用collection来订阅更改。该流程发出的任何类型为 UpdatedResults
的对象都表示对结果设立的更改。
|
|
线程
对于 Java SDK,Realm、Realm 对象和结果不能在线程之间传递。Kotlin SDK 默认会冻结这些对象,使其具有线程安全性。与 Java SDK 使用的活动对象不同,Kotlin SDK 中的冻结对象不会在底层数据变更时自动更新。对于 Kotlin SDK,您必须使用通知来订阅更新。
|
|
提示
迁移
对于 Java SDK,迁移是手动进程。Kotlin SDK 可自动执行迁移,还允许您访问类似的动态 Realm 接口,对迁移逻辑进行自定义调整。
|
|
下一步
现在您已经了解了 Java SDK 和 Kotlin SDK 的区别,请查看 Kotlin SDK 文档 的其他部分。