Docs 菜单
Docs 主页
/ /
Atlas Device SDKs
/ /

配置 Realm - React Native SDK

在此页面上

  • 先决条件
  • 在不同步的情况下配置 Realm
  • 配置选项
  • 配置内存 Realm
  • 加密 Realm
  • 配置同步 Realm
  • 公开多个 Realm
  • 创建独立的 Context 对象
  • 提取提供者和钩子
  • 使用命名提供者和钩子
  • 无需提供模式即可访问 Realm
  • @realm/react 提供程序和钩子

Realm React Native SDK 和 @realm/react 包为 Realm 提供了许多配置选项。

如何配置 Realm 决定了 Realm 的功能以及您处理数据的方式。此页面包含有关如何以各种方式配置 Realm 的信息。

当您在 React Native 应用程序中配置 Realm 之前,请执行以下操作:

  1. 安装 Realm React Native SDK

  2. 安装 @ 域/react包

RealmProvider是一个向其子组件公开 Realm 的包装器。 您可以通过将属性传递给RealmProvider来配置 Realm。

呈现RealmProvider时,会打开 Realm。 这意味着如果呈现失败,子组件将无法访问 Realm。

要配置非同步 Realm:

  1. @realm/react 导入 RealmProvider

  2. 将对象模型传递给 schema 属性。

  3. 将其他配置对象属性作为属性添加到RealmProvider以配置您的 Realm。

import React from 'react';
import {RealmProvider} from '@realm/react';
function AppWrapperLocal() {
return (
<RealmProvider schema={[YourObjectModel]}>
<RestOfApp />
</RealmProvider>
);
}

有关在非同步域中使用的提供程序和钩子的列表,请查看 @realm/react 提供程序和钩子

您可以通过设置与配置对象的属性匹配的属性来配置RealmProvider 。 您还可以设置fallbackrealmRef属性。

  • realmRef
    useRef 一起使用,用于向 RealmProvider 以外的进程公开已配置的 Realm。这对于客户端重置回退等操作非常有用。
  • fallback
    在等待 Realm 打开时呈现。局部 Realm 通常打开得足够快,因此不需要 fallback 属性。

要创建完全在内存中运行而不写入文件的 Realm,请将 true 传递给 RealmProvider 上的 inMemory 属性:

import React from 'react';
import {Realm, RealmProvider} from '@realm/react';
function AppWrapperLocal() {
return (
<RealmProvider inMemory={true}>
<RestOfApp />
</RealmProvider>
);
}

如果内存不足,内存中 Realm 可能会使用磁盘空间;但关闭 Realm 时,内存中 Realm 创建的文件将被删除。

要加密磁盘上的 Realm 文件,请参阅加密 Realm

如需打开使用 Device Sync 与 Atlas 同步数据的 Realm,请参阅“打开同步 Realm”。

@realm/react 包使用 React Context 对象 和提供商组件在应用程序中公开域。您可以使用 React 钩子访问域。

要显示多个 Realm,请考虑以下因素:

  • 每个 Realm 都需要自己的 Context 对象,该对象是使用createRealmContext() 创建的。

  • 每个上下文中的提供程序和钩子都应该被命名空间化,以便可以轻松推断您正在使用的 Realm。

  • 如果直接从 @realm/react 导入 RealmProvider,则它是一个独立的 Context 对象。该对象的提供商和钩子无法与使用 createRealmContext 创建的 Context 对象解除同步。

您可以使用createRealmContext() 创建其他 Context 对象,从而一次打开多个 Realm。

import React from 'react';
import {
Realm,
AppProvider,
UserProvider,
createRealmContext,
} from '@realm/react';
class SharedDocument extends Realm.Object {
static schema = {
name: 'SharedDocument',
properties: {
_id: 'objectId',
owner_id: 'objectId',
title: 'string',
createdDate: 'date',
},
primaryKey: '_id',
};
}
class LocalDocument extends Realm.Object {
static schema = {
name: 'LocalDocument',
properties: {
_id: 'objectId',
name: 'string',
createdDate: 'date',
},
};
}
// Create Shared Document context object.
const SharedRealmContext = createRealmContext({
schema: [SharedDocument],
});
// Create Local Document context object.
const LocalRealmContext = createRealmContext({
schema: [LocalDocument],
});
import React from 'react';
import {
Realm,
AppProvider,
UserProvider,
createRealmContext,
} from '@realm/react';
class SharedDocument extends Realm.Object<SharedDocument> {
_id!: Realm.BSON.ObjectId;
owner_id!: Realm.BSON.ObjectId;
title!: string;
createdDate?: Date;
static schema: ObjectSchema = {
name: 'SharedDocument',
properties: {
_id: 'objectId',
owner_id: 'objectId',
title: 'string',
createdDate: 'date',
},
primaryKey: '_id',
};
}
class LocalDocument extends Realm.Object<LocalDocument> {
_id!: Realm.BSON.ObjectId;
name!: string;
createdDate?: Date;
static schema: ObjectSchema = {
name: 'LocalDocument',
properties: {
_id: 'objectId',
name: 'string',
createdDate: 'date',
},
};
}
// Create Shared Document context object.
const SharedRealmContext = createRealmContext({
schema: [SharedDocument],
});
// Create Local Document context object.
const LocalRealmContext = createRealmContext({
schema: [LocalDocument],
});

你需要从每个 Context 对象中提取提供商和钩子。您应使用解构来命名提供商和钩子的命名空间。这使您可以更轻松地推断您正在使用的 Realm。

请参阅非同步 RealmProvider 钩子,了解哪些钩子可用于未使用 Device Sync 的RealmProvider

// Namespace the Shared Document context's providers and hooks.
const {
RealmProvider: SharedDocumentRealmProvider,
useRealm: useSharedDocumentRealm,
} = SharedRealmContext;
// Namespace the Local Document context's providers and hooks.
const {
RealmProvider: LocalDocumentRealmProvider,
useRealm: useLocalDocumentRealm,
} = LocalRealmContext;

提取上下文对象的提供程序和钩子后,您可以在应用程序的组件中使用它们。提取的提供程序内部的子组件可以访问提取的钩子。

function TwoRealmsWrapper() {
return (
<View>
<AppProvider id={APP_ID}>
<UserProvider fallback={LogIn}>
{/* This is a Flexible Sync realm. */}
<SharedDocumentRealmProvider sync={{flexible: true}}>
<AppSectionOne />
</SharedDocumentRealmProvider>
</UserProvider>
</AppProvider>
{/* This is a separate local-only realm. */}
<LocalDocumentRealmProvider>
<AppSectionTwo />
</LocalDocumentRealmProvider>
</View>
);
}
function AppSectionOne() {
const realm = useSharedDocumentRealm();
// Work with shared documents...
}
function AppSectionTwo() {
const realm = useLocalDocumentRealm();
// Work with local documents...
}

在设备上创建 Realm 后,您无需始终传递 模式即可访问该 Realm。您可以使用 RealmProvider,无需将任何对象模型传递到其 schema 属性。该 Realm 的模式派生自 Realm.defaultPath 中的现有 Realm 文件。

在不提供模式的情况下访问 Realm 仅适用于本地 Realm。使用同步 Realm 时,必须始终传递模式。

import React from 'react';
import {RealmProvider} from '@realm/react';
function AppWrapper() {
return (
// To access a realm at the default path, do not pass any configuration.
// Requires a realm that has already been created.
<RealmProvider>
<RestOfApp />
</RealmProvider>
);
}

@realm/react 拥有提供者和钩子,可简化非同步 Realm 及其数据的处理。

提供者/钩子
说明
例子

一种封装器,可将 Realm 公开给其子组件,这些子组件可以访问允许您读取、写入和更新数据的钩子。

返回由 RealmProvider 打开的 Realm 实例。

const realm = useRealm();

从给定的主键类型和值返回一个对象(Realm.Object<T>)。更新返回的对象的任何更改。如果对象不存在或已被删除,则返回 null

const myTask = useObject(Task, _id);

返回给定类型的对象集合(Realm.Results<T & Realm.Object T>)。更新集合中任何对象的任何变更。如果集合为空,则返回空数组。

const tasks = useQuery(Task);

后退

Realm 文件