打包 Realm 文件-React Native SDK
Realm 支持捆绑Realm 文件。 捆绑 Realm 文件时,您将在应用程序下载中包含一个数据库及其所有数据。
这允许用户使用一设立初始数据首次启动应用程序。 对于同步 Realm,捆绑可以避免用户首次打开应用程序时长时间的初始下载。 相反,用户必须只下载自生成捆绑文件以来发生的同步更改。
重要
仅适用于本地 Realm
此页面上的内容仅适用于本地 Realm。
步骤
请按照以下步骤为您的 React Native 应用程序创建并捆绑 Realm 文件。
创建要捆绑的 Realm 文件
为 React Native 应用创建捆绑 Realm 的最简单方法是编写单独的 Node.js 脚本来创建捆绑包。
您应该使用 realm
包而不是@realm/react
来创建捆绑包。
构建一个共享应用程序数据模型的临时 Realm 应用。
打开一个 Realm 并添加要捆绑的数据。 如果使用同步 Realm,请留出时间让 Realm 完全同步。
create-bundled-realm.jsimport Realm from "realm"; import { Dog } from "./schemas"; // open realm const config = { schema: [Dog], path: "bundle.realm", }; const realm = await Realm.open(config); // add data to realm realm.write(() => { realm.create("Dog", { name: "Jasper", age: 10, type: "Golden Retriever" }); realm.create("Dog", { name: "Maggie", age: 12, type: "Collie" }); realm.create("Dog", { name: "Sophie", age: 6, type: "German Shepard" }); }); realm.close(); 记下捆绑 Realm 文件的文件路径。 您需要此文件才能在生产应用程序中使用捆绑域,如下一节所述。
temp_realm_app. ├── bundle.realm ... rest of files in _temp_ application
将 Realm 文件与您的应用捆绑在一起
现在您已拥有包含初始数据的 Realm 副本,请将捆绑的 Realm 文件添加到生产应用程序中。 对于 iOS 和 Android 版本,放置捆绑 Realm 的位置有所不同。
在 Android Studio 中打开 React Native 生成的
android
文件夹。在 Project树中,导航到
app > src > main
。 右键单击main
目录。 创建一个名为assets
的新子目录。将捆绑的 Realm 文件拖到
assets
目录中。
在 Xcode 中,打开React Native生成的
ios
目录内的your_project_name.xcworkspace
文件。在项目导航器中选择您的应用,然后在项目概述中选择Build Phases标签页。
展开Copy Bundle Resources项。
单击 + 图标。
单击 Add Other... 按钮。
找到并添加捆绑的域文件。 请勿更改默认设置,然后选择Finish按钮。
在应用程序中打开捆绑的 Realm
域现已捆绑,用户下载应用时将包含该 Realm。 要将捆绑的域文件添加到应用程序的文档目录中,请调用 Realm.copyBundledRealmFiles() 在您打开域之前。
Realm.copyBundledRealmFiles()
会将应用程序包中的所有*.realm
文件添加到应用程序文档目录中。 此方法不会覆盖任何现有的同名文件,因此每次启动应用时都可以安全地调用。
使用您最初创建捆绑 Realm 时指定的相同名称和配置,打开捆绑 Realm。
现在您已经拥有生产应用程序中包含的 Realm 副本,您需要添加代码来使用它。
import React from 'react'; import {createRealmContext, Realm} from '@realm/react'; import {Dog} from './schema'; Realm.copyBundledRealmFiles(); const realmContext = createRealmContext({schema: [Dog], path: 'bundle.realm'}); const {RealmProvider} = realmContext; export default function OpenBundledRealm() { return ( <RealmProvider> {/* Rest of app has access to objects pre-populated in the bundled realm. */} <RestOfApp /> </RealmProvider> ); }