注意
什么是 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 文档 的其他部分。