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

捆绑Realm文件 - Node SDK

在此页面上

  • Overview
  • 创建用于捆绑的 Realm 文件
  • 在生产应用程序中捆绑 Realm 文件
  • 从捆绑的 Realm 文件中打开 Realm
  • 捆绑同步Realm

Realm 支持捆绑Realm 文件。 捆绑 Realm 文件时,您将在应用程序下载中包含一个数据库及其所有数据。

这允许用户使用一设立初始数据首次启动应用程序。 对于同步 Realm,捆绑可以避免用户首次打开应用程序时长时间的初始下载。 相反,用户必须只下载自生成捆绑文件以来发生的同步更改。

要创建 Realm 文件并将其与应用程序捆绑在一起,请执行以下操作:

  1. 创建一个 Realm 文件,其中包含要捆绑的数据。

  2. 将捆绑的域文件添加到生产应用程序中。

  3. 在生产应用程序中,从捆绑的资产文件中打开域 。 对于同步 Realm,您必须包含分区键。

注意

捆绑同步 Realm

SDK 版本10.12.0 引入了捆绑同步 Realm 的功能。 在版本10.12.0之前, 您只能捆绑本地 Realm。 有关捆绑同步 Realm 时的注意事项和限制的详细信息,请参阅捆绑同步 Realm部分。

  1. 构建一个共享应用程序数据模型的临时 Realm 应用。

  2. 打开一个 Realm 并添加要捆绑的数据。 如果使用同步 Realm,请留出时间让 Realm 完全同步。

  3. 使用writeCopyTo()方法将 Realm 复制到新文件中:

    const originalPath = path.join(__dirname, "original.realm");
    const originalConfig = {
    schema: [Car],
    path: originalPath,
    };
    const originalRealm = await Realm.open(originalConfig);
    const copyPath = path.join(__dirname, "copy.realm");
    originalRealm.writeCopyTo(copyPath);

    writeCopyTo() 在复制之前会自动将您的 Realm 压缩到尽可能小的大小。

    注意

    同步 Realm 和纯本地 Realm 之间的区别

    上面的示例使用SyncConfiguration为 Configuration 的sync字段配置同步 Realm。 要创建本地 Realm 的副本,请不要在配置对象中包含sync字段。

  4. 请注意捆绑域文件的文件路径,该文件可以在上一步中传递给writeCopyTo()的参数指定的位置找到。 您需要此文件才能在生产应用程序中使用捆绑域 ,如下一节所述。

    temp_realm_app
    .
    ├── copyOfDefault.realm
    ... rest of files in _temp_ application

现在您已拥有包含初始数据的 Realm 副本,请将其与生产应用程序捆绑在一起。

将上一节中创建的捆绑域文件添加到生产应用程序中。

prod_realm_app
.
├── copyOfDefault.realm
... rest of files in _prod_ application

现在您已经拥有生产应用程序中包含的 Realm 副本,您需要添加代码来使用它。

创建一个配置,将捆绑域的路径作为path字段的值。 将该配置传递给Realm.open() 方法。 现在,您可以在刚刚打开的域中使用来自捆绑域的数据。

const copyConfig = {
schema: [Car],
path: "path/to/bundled/file.realm"
};
const copyRealm = await Realm.open(copyConfig);

注意

仅限同类型同步

此方法仅支持复制另一个基于分区的同步用户的基于分区的同步配置,或复制另一个 Flexible Sync 用户的 Flexible Sync 配置。 您不能使用此方法在基于分区的同步 Realm 和 Flexible Sync Realm 之间进行转换,反之亦然。

通常,捆绑同步域的工作方式与捆绑仅本地域相同。 但是,您只能捆绑完全同步的 Realm。 在捆绑之前,确保域已与服务器完全同步:

const config = {
sync: {
user: app.currentUser,
partitionValue: app.currentUser.id,
},
schema: [Car],
};
const realm = await Realm.open(config);
// create many changes
realm.write(() => {
for (let i = 0; i < 25; i++) {
realm.create("Car", {
make: "Toyota",
model: "Prius",
miles: i,
owner: app.currentUser.id,
});
}
});
// ensure synchronize all changes before copy
await realm.syncSession.uploadAllLocalChanges();
await realm.syncSession.downloadAllServerChanges();
// changes are synchronized -- we can copy the realm
realm.writeCopyTo(__dirname + "syncedCopy.realm");

重要

捆绑同步 Realm

如果您的后端应用程序使用Flexible Sync ,则用户可能会在首次打开捆绑 Realm 文件时遇到客户端重置。 启用客户端最大离线时间(默认情况下启用客户端最大离线时间)时,可能会出现这种情况。 如果在用户首次同步之前生成捆绑 Realm 文件的时间超过了客户端最大离线时间设置指定的天数,则用户会遇到客户端重置。

执行客户端重置的应用程序会从应用程序后端下载 Realm 的完整状态。 这抵消了捆绑 Realm 文件的优势。 为防止客户端重置并保留 Realm 文件捆绑的优点,请执行以下操作:

  • 避免在捆绑同步 Realm 的应用程序中使用客户端最大离线时间。

  • 如果您的应用程序确实使用了客户端最大离线时间,请确保您的应用程序下载始终包含最近同步的 Realm 文件。 为每个应用程序版本生成一个新文件,并确保任何版本保持最新状态的时间都不会超过客户端最大离线时间天数。

打开使用较旧的基于分区的同步的捆绑同步域时,还存在更多限制。 有关使用通过基于分区的同步配置的 Realm 的更多信息,请参阅基于分区的同步- Node.js SDK。

后退

减少 Realm 文件大小