定义 Realm 对象模型 - React Native SDK
在此页面上
定义对象类型
要定义 Realm 对象类型,请创建一个扩展
Realm.Object
的类。在静态属性
name
中定义类型的
properties
和
schema
。在 Realm 中的对象类型中,该类型的名称必须是唯一的。
支持的属性类型
Realm 对象中的每个属性都有一个明确定义的数据类型。属性的类型可以是原始数据类型,也可以是在同一个 Realm 中定义的对象类型。类型还指定了属性是包含单个值还是包含值的列表。
要指定字段包含原始值类型的列表,请在类型名称后面添加
[]
。
有关支持的属性类型的列表,请参阅 属性类型
定义对象属性
要定义对象类型的属性,请在
properties
字段下创建表示属性名称和数据类型的键值对。
以下模式定义了具有以下属性的
Car
类型:
_id
make
、
model
和
miles
。
声明可选属性
要将属性标记为可选,请使用对象语法并将
optional
设置为
true
。您还可以使用简化的语法:将问号
?
附加到类型。这最适合基本类型。对于更复杂的类型,应使用更具体的对象语法。
在下面的
Person
类示例中,
age
和
birthday
属性都是可选的。
class Person extends Realm.Object<Person> { name!: string; age?: number; birthday?: Date; static schema: ObjectSchema = { name: 'Person', properties: { name: 'string', age: { type: 'int', optional: true, }, // You can use a simplified syntax instead. For // more complicated types, use the object syntax. birthday: 'date?', }, }; }
声明主键
要将某个属性指定为对象类型的主键,请将模式的
primaryKey
字段设置为属性名称。
注意
主键 是唯一标识对象的属性。 Realm 会自动对主键属性进行 索引 ,这允许您根据主键高效地读取和修改对象。
如果某个对象类型具有主键,则该类型的所有对象都必须包含主键属性,并且在 Realm 中相同类型的对象中,该主键属性具有唯一值。一个对象类型只能有一个主键。将某个对象类型的任何对象添加到 Realm 后,您无法更改该对象类型的主键属性,也无法修改对象的主键值。
在以下
Task
类的示例中,我们将
_id
属性指定为主键。
为属性创建索引
如果经常根据特定属性执行
读取操作
,则可以为该属性建立索引以优化性能。Realm 支持为字符串、整数、布尔值、
Date
、
UUID
和
ObjectId
属性建立索引。
注意
索引 显著提高了某些读取操作的速度,但代价是写入速度略微下降,并增加了存储和内存开销。Realm 将索引存储在磁盘上,这会使您的 Realm 文件更大。每个索引条目至少有 12 个字节。索引条目的排序支持高效的相等匹配和基于范围的查询操作。
要为给定属性建立索引,请将该属性的
indexed
字段设置为
true
。
在以下
Book
类的示例中,我们在
name
属性上定义了一个索引。
设置全文搜索索引
除了标准索引外,Realm 还支持对字符串属性创建 Atlas 全文搜索索引。虽然无论是否使用标准索引都可以查询字符串字段,但 FTS 索引支持搜索多个词汇和短语并排除其他。
有关查询 FTS 索引的更多信息,请参阅 使用全文搜索进行筛选 。
要创建 FTS 索引,请将
索引
类型设置为
'full-text'
。 这将启用对该属性的全文查询。 在以下示例中,我们将
name
属性的索引类型设置为
'full-text'
:
class Book extends Realm.Object<Book> { name!: string; price?: number; static schema: ObjectSchema = { name: 'Book', properties: { name: {type: 'string', indexed: 'full-text'}, price: 'int?', }, }; }
设置默认属性值
要定义默认值,请将属性值设置为具有
type
字段和
default
字段的对象。
在以下
Car
类的示例中,我们定义了一个默认值为
0
的
miles
属性。
11.1.0 版新增功能 。
在 Realm.js v11.1.0 及更高版本中,您可以使用函数来定义动态默认值,例如下例中的
timestamp
属性。
重新映射属性
要在代码中使用与 Realm 中存储的属性名称不同的属性名称,请将
mapTo
设置为代码中显示的属性名称。
在以下
Employee
类的示例中,我们将
first_name
属性重映射到
firstName
。
定义非对称对象
如果您使用灵活同步并且需要将集合从设备单向同步到 Atlas 数据库,则可以在对象模式上设置
asymmetric
属性。
定义非结构化数据
realm@12.9.0
版本中的新增功能
。
从 JS SDK 版本12开始。 9 。 0 ,您可以在
mixed
属性中存储
混合数据的集合
。您可以使用此功能对复杂的数据结构(例如 JSON 或 MongoDB 文档)进行建模,而无需定义严格的数据模型。
非结构化数据 是指不容易符合预期模式的数据,因此对单个数据类进行建模很困难或不切实际。例如,您的应用程序可能具有高度可变的数据或结构在运行时未知的动态数据。
在混合属性中存储集合可提供灵活性,而无需牺牲功能性,包括使用 Device Sync 时的性能同步。您可以像使用非混合集合一样使用它们:
-
您最多可以嵌套100级混合集合。
-
您可以查询混合集合 上的更改并对其做出反应 。
-
您可以查找并更新单个混合集合元素。
但是,与使用结构化模式或将 JSON blob 序列化为单个字符串属性相比,在混合集合中存储数据的性能较低。
要对应用中的非结构化数据进行建模,请在模式中将适当的属性定义为
混合
类型。然后,您可以将这些
mixed
属性设置为混合元素的
列表
或
字典
集合。请注意,
mixed
属性
不能
保存集合或嵌入式对象。
提示
-
当类型未知但每个值都有唯一标识符时,请使用混合数据类型的映射。
-
当类型未知但对象的顺序有意义时,请使用混合数据类型的列表。
TypeScript 和必需属性
我们建议使用
Realm.create()
创建
Realm 对象 ,但您也可以对对象模型的类使用
new
操作符。
如果您使用
new
,则在扩展
Realm.Object
时,必须将您的类作为泛型添加,并添加任何必需的属性。这将为您的对象模型提供完整的 TypeScript 支持,包括未定义必需字段时的类型错误。
class Book extends Realm.Object<Book, 'name' | 'store'> { name!: string; store!: string; price?: number; static schema: ObjectSchema = { name: 'Book', properties: { name: {type: 'string', indexed: true}, store: 'string', price: 'int?', }, }; }