从 Java SDK 迁移到 Kotlin SDK
注意
什么是 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()替换所有这些选项。 获得 结果流后,您可以调用 对方付费 订阅变更。该流程发出的任何类型为UpdatedResults
的对象都表示对结果集的更改。
|
|
线程
对于 Java SDK,Realm、Realm 对象和结果不能在线程之间传递。Kotlin SDK 默认会冻结这些对象,使其具有线程安全性。与 Java SDK 使用的活动对象不同,Kotlin SDK 中的冻结对象不会在底层数据变更时自动更新。对于 Kotlin SDK,您必须使用通知来订阅更新。
|
|
迁移
对于 Java SDK,迁移是手动进程。Kotlin SDK 可自动执行迁移,还允许您访问类似的动态 Realm 接口,对迁移逻辑进行自定义调整。
|
|
下一步
现在您已经了解了 Java SDK 和 Kotlin SDK 的区别,请查看 Kotlin SDK 文档 的其他部分。