配置 Realm - React Native SDK
在此页面上
Realm React Native SDK 和 @realm/react
包为 Realm 提供了许多配置选项。
如何配置 Realm 决定了 Realm 的功能以及您处理数据的方式。此页面包含有关如何以各种方式配置 Realm 的信息。
先决条件
当您在 React Native 应用程序中配置 Realm 之前,请执行以下操作:
在不同步的情况下配置 Realm
RealmProvider是一个向其子组件公开 Realm 的包装器。 您可以通过将属性传递给RealmProvider
来配置 Realm。
呈现RealmProvider
时,会打开 Realm。 这意味着如果呈现失败,子组件将无法访问 Realm。
要配置非同步 Realm:
从
@realm/react
导入RealmProvider
。将对象模型传递给
schema
属性。将其他配置对象属性作为属性添加到
RealmProvider
以配置您的 Realm。
import React from 'react'; import {RealmProvider} from '@realm/react'; function AppWrapperLocal() { return ( <RealmProvider schema={[YourObjectModel]}> <RestOfApp /> </RealmProvider> ); }
有关在非同步域中使用的提供程序和钩子的列表,请查看 @realm/react 提供程序和钩子
配置选项
您可以通过设置与配置对象的属性匹配的属性来配置RealmProvider
。 您还可以设置fallback
和realmRef
属性。
realmRef
- 与
useRef
一起使用,用于向RealmProvider
以外的进程公开已配置的 Realm。这对于客户端重置回退等操作非常有用。
fallback
- 在等待 Realm 打开时呈现。局部 Realm 通常打开得足够快,因此不需要
fallback
属性。
配置内存 Realm
要创建完全在内存中运行而不写入文件的 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 文件,请参阅加密 Realm。
配置同步 Realm
如需打开使用 Device Sync 与 Atlas 同步数据的 Realm,请参阅“打开同步 Realm”。
公开多个 Realm
@realm/react
包使用 React Context 对象 和提供商组件在应用程序中公开域。您可以使用 React 钩子访问域。
要显示多个 Realm,请考虑以下因素:
每个 Realm 都需要自己的 Context 对象,该对象是使用createRealmContext() 创建的。
每个上下文中的提供程序和钩子都应该被命名空间化,以便可以轻松推断您正在使用的 Realm。
如果直接从
@realm/react
导入RealmProvider
,则它是一个独立的 Context 对象。该对象的提供商和钩子无法与使用createRealmContext
创建的 Context 对象解除同步。
创建独立的 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 后,您无需始终传递 模式即可访问该 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/react
拥有提供者和钩子,可简化非同步 Realm 及其数据的处理。
提供者/钩子 | 说明 | 例子 | |
---|---|---|---|
一种封装器,可将 Realm 公开给其子组件,这些子组件可以访问允许您读取、写入和更新数据的钩子。 | |||
返回由 RealmProvider 打开的 Realm 实例。 |
| ||
从给定的主键类型和值返回一个对象( |
| ||
返回给定类型的对象集合( |
|