模型数据 - Java SDK
对象模式是一种配置对象,用于定义 Realm 对象类型的字段和关系。Android Realm 应用程序使用 Realm 模式通过 Java 或 Kotlin 类定义对象模式。
对象模式指定对对象字段的约束,例如每个字段的数据类型、字段是否必填以及默认字段值。模式还可以定义 Realm 中对象类型之间的关系。
修改应用程序的 Realm 模式需要您将数据从旧版本的 Realm 模式迁移到新版本。
Realm 应用程序
每个应用程序都有一个Realm 模式,由该应用程序中 Realm 可能包含的每种对象类型的对象模式列表组成。
域保证所有 Realm Object都符合对象类型的模式,并在创建、修改或删除对象时对其进行验证。
使用 Atlas Device Sync 的应用程序可以通过两种方式定义模式:
在开发模式下使用 Kotlin 和 Java 类声明的对象模式。
应用程序后端中的 JSON对象模式。
关系
您可以使用 RealmObject 字段在域中建立 一对一 关系模型。您可以对 RealmList 字段 的一对多 和 多对一 关系进行建模。反向关系是一对多或多对一关系的另一端。 您可以使用 RealmResults 字段上的 @LinkingObjects 注解,建立可遍历的 反向 关系。在RealmObject
的实例中,反向关系字段设立Realm对象,这些对象通过所描述的关系点该对象实例。 您可以通过手动查询找到同一设立Realm对象,但反向关系字段会容量样板查询代码和出错的可能性。
RealmObject
与包含自己数据的普通 Java 对象不同,Realm 对象不包含数据。 相反,Realm 对象会直接向 Realm 读取和写入属性。
Realm 对象的实例可以是托管的,也可以是非托管的。
托管对象包括:
在 Realm 中持久化
始终保持最新状态
线程限制
通常比非托管版本更轻量,因为它们在 Java 堆上占用的空间更少。
非托管对象就像普通的 Java 对象一样,因为它们不会持久化,也从不自动更新。 您可以跨线程自由移动非托管对象。
您可以使用realm.copyToRealm()在两种状态之间进行转换 和realm.copyFromRealm()。
RealmProxy
RealmProxy
类是 Realm SDK 确保 Realm 对象本身不包含任何数据的方法。 相反,每个类的RealmProxy
会直接访问数据库中的数据。
对于项目中的每个模型类,Realm 注解处理器都会生成相应的RealmProxy
类。 此类扩展了您的模型类,并在您调用Realm.createObject()
时返回。 在您的代码中,该对象的工作方式与模型类相同。
Realm 对象限制
Realm 对象:
不能包含使用
final
或volatile
修饰符的字段(反向关系字段除外)。不能扩展除
RealmObject
之外的任何对象。必须包含一个空构造函数(如果您的类不包含任何构造函数,则自动生成的空构造函数就足够了)
命名限制:
类名不能超过 57 个字符。
类名在域模块中必须是唯一的
字段名称不能超过 63 个字符。
大小限制:
String
或byte[]
字段不能超过 16 MB。
使用限制:
由于 Realm 对象是活动的,可以随时更改,因此它们的
hashCode()
值可能会随着时间的推移而变化。 因此,您不应将RealmObject
实例用作任何映射或集中的键。
增量构建
Realm 使用的字节码转换器支持增量构建,但在从 Realm 对象字段中添加或删除以下内容时,您的应用程序需要完全重建:
@Ignore
注解static
关键字transient
关键字
在这些情况下,您可以使用 、 Build > Clean Project和Build > Rebuild Project执行完全重建。
模式版本
模式版本可标识 Realm 模式在某个时间点的状态。Realm 会跟踪每个 Realm 的模式版本,并使用该信息将每个 Realm 中的对象映射到正确的模式。
模式版本是指打开 Realm 时可包含在 Realm 配置中的整数。如果客户端应用程序在打开 Realm 时未指定版本号,则该 Realm 默认采用 0
版本。
重要
单调递增版本
迁移必须将 域 更新到更高的模式版本。 如果客户端应用程序打开的 Realm 的模式版本低于该 Realm 的当前版本,或者指定的模式版本与该 Realm 的当前版本相同但包含不同的对象模式,则 Realm 会引发错误。
迁移
本地迁移是针对不会自动与另一个 Realm同步的 Realm 的迁移。 本地迁移可以访问现有的 Realm 模式、版本和对象,并定义以增量方式将 Realm 更新到新模式版本的逻辑。 要执行本地迁移,您必须指定高于当前版本的新模式版本,并在打开过时 Realm 时提供迁移函数。
借助 SDK,您可以使用手动迁移来更新底层数据,以反映模式更改。 在此类手动迁移期间,您可以在模式中添加或删除属性时定义新的和已删除的属性。 通过DynamicRealm公开的可编辑模式为重命名字段提供了便利的功能。 这样,您就可以在复杂的模式迁移期间完全控制数据的行为。