添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
“文档” 菜单

定义 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 属性。

[email protected] 版本中的新增功能

从 JS SDK 版本12开始。 9 。 0 ,您可以在 mixed 属性中存储 混合数据的集合 。您可以使用此功能对复杂的数据结构(例如 JSON 或 MongoDB 文档)进行建模,而无需定义严格的数据模型。

非结构化数据 是指不容易符合预期模式的数据,因此对单个数据类进行建模很困难或不切实际。例如,您的应用程序可能具有高度可变的数据或结构在运行时未知的动态数据。

在混合属性中存储集合可提供灵活性,而无需牺牲功能性,包括使用 Device Sync 时的性能同步。您可以像使用非混合集合一样使用它们:

但是,与使用结构化模式或将 JSON blob 序列化为单个字符串属性相比,在混合集合中存储数据的性能较低。

要对应用中的非结构化数据进行建模,请在模式中将适当的属性定义为 混合 类型。然后,您可以将这些 mixed 属性设置为混合元素的 列表 字典 集合。请注意, mixed 属性 不能 保存集合或嵌入式对象。

提示

  • 当类型未知但每个值都有唯一标识符时,请使用混合数据类型的映射。

  • 当类型未知但对象的顺序有意义时,请使用混合数据类型的列表。

我们建议使用 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?',
},
};
}