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

基于分区的同步 — React Native SDK

在此页面上

  • 分区值
  • 配置基于分区的同步 Realm
  • 复制数据并打开 Realm
  • 从基于分区的同步迁移到 Flexible Sync
  • 迁移后更新客户端代码

基于分区的同步是一种较旧的模式,用于将 Atlas Device Sync 与 Realm React Native SDK 结合使用。 我们建议对新应用使用Flexible Sync 。 此页面上的信息适用于仍在使用基于分区的同步的用户。

有关基于分区的同步以及如何在Atlas App Services中配置该同步的更多信息,请参阅App Services文档中的基于分区的同步

当您为后端应用配置选择基于分区的同步时,您的客户端实施必须包含分区值。 这是您在配置基于分区的同步时选择的分区键字段的值。

分区值决定客户端应用程序可以访问哪些数据。

您可以在打开同步 Realm 时传入分区值。

要打开 Flexible Sync Realm,请使用 @realm/reactcreateRealmContext()函数及其返回的RealmProvider

在嵌套在UserProvider中的RealmProvider中,添加具有包含flexible: trueSyncConfiguration对象的sync属性。

请注意, UserProvider会自动将经过身份验证的用户传递给RealmProvider

<RealmProvider
schema={[YourObjectModel]}
sync={{
partitionValue: 'testPartition',
}}>
<RestOfApp />
</RealmProvider>

realm@10.14.0 版本中的新增功能

要将数据从现有域复制到具有不同配置选项的新域,请为新配置传递 Realm.writeCopyTo() 方法。

注意

仅限同类型同步

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

在新域的配置中,您必须指定 path

如果将复制的 Realm 写入已存在的 Realm 文件,则数据将逐个对象写入。 如果给定主键已经存在对象,则复制操作会替换对象。 您复制的 Realm 和您正在写入的 Realm 模式必须兼容,复制操作才能成功。 仅复制两种配置模式中的对象。

配置更改可以包括对SyncConfiguration 的修改:

  • 本地 Realm 到同步 Realm

  • 同步 Realm 到本地 Realm

配置更改还可以包括对ConfigurationencryptionKey属性的更改:

  • 加密 Realm 到未加密 Realm

  • 未加密 Realm 到加密 Realm

例子

将本地 Realm 转换为同步 Realm

const localConfig = {
schema: [Car],
path: "localOnly.realm",
};
const localRealm = await Realm.open(localConfig);
const syncedConfig = {
schema: [Car],
path: "copyLocalToSynced.realm",
sync: {
user: app.currentUser,
partitionValue: "myPartition",
},
};
localRealm.writeCopyTo(syncedConfig);
const syncedRealm = await Realm.open(syncedConfig);
const localConfig: Realm.Configuration = {
schema: [Car],
path: "localOnly.realm",
};
const localRealm = await Realm.open(localConfig);
const syncedConfig: Realm.Configuration = {
schema: [Car],
path: "copyLocalToSynced.realm",
sync: {
user: app.currentUser!,
partitionValue: "myPartition",
},
};
localRealm.writeCopyTo(syncedConfig);
const syncedRealm = await Realm.open(syncedConfig);

您还可以合并对配置的更改。例如,您可以将本地加密域作为同步的未加密域打开,或者将未加密的同步域作为加密的同步域打开。

例子

将同步加密 Realm 转换为本地未加密 Realm

// Create a secure key.
const encryptionKey = new Int8Array(64);
// ... store key
const syncedEncryptedConfig = {
schema: [Car],
path: "syncedEncrypted.realm",
sync: {
user: app.currentUser,
partitionValue: "myPartition",
},
encryptionKey,
};
const syncedEncryptedRealm = await Realm.open(syncedEncryptedConfig);
const localUnencryptedConfig = {
schema: [Car],
path: "copyLocalUnencrypted.realm",
};
syncedEncryptedRealm.writeCopyTo(localUnencryptedConfig);
const localUnencryptedRealm = await Realm.open(syncedEncryptedConfig);
// Create a secure key.
const encryptionKey = new Int8Array(64);
// ... store key
const syncedEncryptedConfig: Realm.Configuration = {
schema: [Car],
path: "syncedEncrypted.realm",
sync: {
user: app.currentUser!,
partitionValue: "myPartition",
},
encryptionKey,
};
const syncedEncryptedRealm = await Realm.open(syncedEncryptedConfig);
const localUnencryptedConfig: Realm.Configuration = {
schema: [Car],
path: "copyLocalUnencrypted.realm",
};
syncedEncryptedRealm.writeCopyTo(localUnencryptedConfig);
const localUnencryptedRealm = await Realm.open(syncedEncryptedConfig);

您可以将 App Services Device Sync 模式从基于分区的同步迁移到 Flexible Sync。 迁移是一个自动过程,无需对应用程序代码进行任何更改。 自动迁移需要 Realm Node.js SDK 版本 11.10.0 或更高版本。

通过迁移,您可以保留现有的 App Services 用户和身份验证配置。 Flexible Sync提供更通用的权限配置选项和更细粒度的数据同步。

有关如何将App Services App从基于分区的同步迁移到Flexible Sync的更多信息,请参阅迁移Device Sync模式。

从基于分区的同步自动迁移到Flexible Sync不需要对客户端代码进行任何更改。 但是,为了支持此功能,Realm 会通过以下方式自动处理两种同步模式之间的差异:

  • 自动为每个Realm 对象类型创建Flexible Sync订阅,其中partitionKey == partitionValue

  • partitionKey字段注入到每个对象中(如果尚不存在)。 这是自动Flexible Sync订阅所必需的。

如果您需要在迁移后更新客户端代码,请考虑更新客户端代码库以删除隐藏的迁移功能。 在以下情况下,您可能需要更新客户端代码库:

  • 您在客户端代码库中添加新模型或更改模型

  • 添加或更改涉及读取或写入 Realm 对象的功能

  • 您希望对同步的数据实施更细粒度的控制

进行以下更改,将基于分区的同步客户端代码转换为使用 Flexible Sync:

  • flexible:true添加到您打开同步 Realm 的SyncConfiguration对象

  • 将相关属性添加到对象模型中,以便在 Flexible Sync 订阅中使用。 例如,您可以添加ownerId属性,使用户能够仅同步自己的数据。

  • 删除自动Flexible Sync订阅并手动创建相关订阅。

有关 Flexible Sync 权限策略的示例,包括如何为这些策略进行数据建模的示例,请参阅Device Sync权限指南。

当您从基于分区的同步迁移到Flexible Sync时,Realm 会自动为您的应用创建隐藏的Flexible Sync订阅。 下次添加或更改订阅时,我们建议您:

  1. 删除自动生成的订阅。

  2. 在客户端代码库中手动添加相关订阅。

这样,您就可以在代码库中同时查看所有订阅逻辑,以便将来进行迭代和调试。

有关自动生成的Flexible Sync订阅的更多信息,请参阅将客户端应用程序迁移到Flexible Sync。

后退

手动客户端重置数据恢复