对象模式是一种配置对象,用于定义 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公开的可编辑模式为重命名字段提供了便利的功能。 这样,您就可以在复杂的模式迁移期间完全控制数据的行为。