基于分区的同步 — React Native SDK
基于分区的同步是一种较旧的模式,用于将 Atlas Device Sync 与 Realm React Native SDK 结合使用。 我们建议对新应用使用Flexible Sync 。 此页面上的信息适用于仍在使用基于分区的同步的用户。
有关基于分区的同步以及如何在Atlas App Services中配置该同步的更多信息,请参阅App Services文档中的基于分区的同步。
分区值
当您为后端应用配置选择基于分区的同步时,您的客户端实施必须包含分区值。 这是您在配置基于分区的同步时选择的分区键字段的值。
分区值决定客户端应用程序可以访问哪些数据。
您可以在打开同步 Realm 时传入分区值。
配置基于分区的同步 Realm
要打开 Flexible Sync Realm,请使用 @realm/react
的createRealmContext()
函数及其返回的RealmProvider
。
在嵌套在UserProvider
中的RealmProvider
中,添加具有包含flexible: true
的SyncConfiguration对象的sync
属性。
请注意, UserProvider
会自动将经过身份验证的用户传递给RealmProvider
。
<RealmProvider schema={[YourObjectModel]} sync={{ partitionValue: 'testPartition', }}> <RestOfApp /> </RealmProvider>
复制数据并打开 Realm
realm@10.14.0
版本中的新增功能。
要将数据从现有域复制到具有不同配置选项的新域,请为新配置传递 Realm.writeCopyTo() 方法。
注意
仅限同类型同步
此方法仅支持复制另一个基于分区的同步用户的基于分区的同步配置,或复制另一个 Flexible Sync 用户的 Flexible Sync 配置。 您不能使用此方法在基于分区的同步 Realm 和 Flexible Sync Realm 之间进行转换,反之亦然。
在新域的配置中,您必须指定 path
。
如果将复制的 Realm 写入已存在的 Realm 文件,则数据将逐个对象写入。 如果给定主键已经存在对象,则复制操作会替换对象。 您复制的 Realm 和您正在写入的 Realm 模式必须兼容,复制操作才能成功。 仅复制两种配置模式中的对象。
配置更改可以包括对SyncConfiguration 的修改:
本地 Realm 到同步 Realm
同步 Realm 到本地 Realm
配置更改还可以包括对Configuration
的encryptionKey
属性的更改:
加密 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);
从基于分区的同步迁移到 Flexible Sync
您可以将 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订阅。 下次添加或更改订阅时,我们建议您:
这样,您就可以在代码库中同时查看所有订阅逻辑,以便将来进行迭代和调试。
有关自动生成的Flexible Sync订阅的更多信息,请参阅将客户端应用程序迁移到Flexible Sync。