Docs 菜单

Docs 主页开发应用程序Atlas Device SDKs

定义 Realm 对象模型 - React Native SDK

在此页面上

  • 定义对象类型
  • 支持的属性类型
  • 定义对象属性
  • 声明可选属性
  • 声明主键
  • 为属性创建索引
  • 设置全文搜索索引
  • 设置默认属性值
  • 重新映射属性
  • 定义非对称对象
  • TypeScript 和必需属性

要定义 Realm 对象类型,请创建一个扩展 Realm.Object 的类。在静态属性 name 中定义类型的 propertiesschema。在 Realm 中的对象类型中,该类型的名称必须是唯一的。

然后,您可以在打开 Realm 时将类本身传递给配置对象的模式属性。

Realm 对象中的每个属性都有一个明确定义的数据类型。属性的类型可以是原始数据类型,也可以是在同一个 Realm 中定义的对象类型。类型还指定了属性是包含单个值还是包含值的列表。

要指定字段包含原始值类型的列表,请在类型名称后面添加 []

有关支持的属性类型的列表,请参阅属性类型

要定义对象类型的属性,请在properties字段下创建表示属性名称和数据类型的键值对。

以下模式定义了具有以下属性的 Car 类型:_id makemodelmiles

要将属性标记为可选,请使用对象语法并将 optional 设置为 true。您还可以使用简化的语法:将问号 ? 附加到类型。这最适合基本类型。对于更复杂的类型,应使用更具体的对象语法。

在下面的 Person 类示例中,agebirthday 属性都是可选的。

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 支持为字符串、整数、布尔值、DateUUIDObjectId 属性建立索引。

注意

索引显著提高了某些读取操作的速度,但代价是写入速度略微下降,并增加了存储和内存开销。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 类的示例中,我们定义了一个默认值为 0miles 属性。

11.1.0 版新增功能

在 Realm.js v11.1.0 及更高版本中,您可以使用函数来定义动态默认值,例如下例中的 timestamp 属性。

要在代码中使用与 Realm 中存储的属性名称不同的属性名称,请将 mapTo 设置为代码中显示的属性名称。

在以下 Employee 类的示例中,我们将 first_name 属性重映射到 firstName

如果您使用灵活同步并且需要将集合从设备单向同步到 Atlas 数据库,则可以在对象模式上设置 asymmetric 属性。

在版本 realm@12.2.1 中进行了更改

在 JS SDK 版本 12.2.0 及更早版本中,您无法从非对称对象链接到 Realm.Object 类型。在 SDK 版本 12.2.1 及更高版本中,除了嵌入式对象以外,非对称对象还可以链接到 Realm.Object 类型。

注意

尝试读取非对称对象

无法读取非对称对象。如果尝试查询非对称对象,您将收到以下错误:“错误:无法查询非对称类。”

要了解有关数据导入的更多信息,请参阅将数据流式传输到 Atlas

我们建议使用 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?',
},
};
}
← 对数据建模 - React Native SDK