基于分区的同步 - .NET SDK
在此页面上
基于分区的同步是将 Atlas Device Sync 与 Realm .NET SDK 结合使用的一种较旧模式。 我们建议对新应用使用Flexible Sync 。 此页面上的信息适用于仍在使用基于分区的同步的用户。
提示
Realm .NET SDK v 11.1.0及更高版本能力从基于分区的同步迁移到 Flexible Sync。 有关更多信息,请参阅: 从基于分区的同步迁移到 Flexible Sync 。 我们建议您迁移较旧的基于分区的同步应用程序,以使用Flexible Sync。
分区值
当您为后端应用配置选择基于分区的同步时,您的客户端实施必须包含分区值。 这是您在配置基于分区的同步时选择的分区键字段的值。
分区值决定客户端应用程序可以访问哪些数据。 您可以在打开同步 Realm 时传入分区值。
在线时打开基于分区的 Sync Realm
在线打开同步 Realm 的步骤如下:
您的应用代码将引导用户完成身份验证。
创建一个包含 分区值 和 用户 对象的 PartitionSyncConfiguration 对象。
通过调用GetInstanceAsync()方法并传入
PartitionSyncConfiguration
对象,打开同步域 。
以下代码演示了这些步骤:
user = await app.LogInAsync( Credentials.EmailPassword("caleb@mongodb.com", "MySekritPwd")); config = new PartitionSyncConfiguration("myPart", user); try { realm = await Realm.GetInstanceAsync(config); } catch (Exception ex) { Console.WriteLine($@"Error creating or opening the realm file. {ex.Message}"); }
在上面的示例中,代码显示了如何通过调用GetInstanceAsync()
异步打开 Realm。 您还可以通过调用 GetInstance() 方法 同步 打开 Realm:
var synchronousRealm = Realm.GetInstance(config);
脱机时打开基于分区的同步 Realm
用户完成身份验证后, User
对象将持续保留在设备上,直到用户注销。 这允许您的应用检索现有用户并在离线状态下打开同步域。一旦设备重新连接到您的应用,SDK 将同步离线时发生的更改。
以下代码演示如何检查是否存在现有的User
对象。 如果未找到,则使用上文概述的过程来获取用户。 如果设备已有user
,则会与该用户一起打开同步 Realm:
if (app.CurrentUser == null) { // App must be online for user to authenticate user = await app.LogInAsync( Credentials.EmailPassword("caleb@mongodb.com", "MySekritPwd")); config = new PartitionSyncConfiguration("_part", user); realm = await Realm.GetInstanceAsync(config); } else { // This works whether online or offline user = app.CurrentUser; config = new PartitionSyncConfiguration("_part", user); realm = Realm.GetInstance(config); }
从基于分区的同步迁移到 Flexible Sync
您可以将 App Services Device Sync 模式从基于分区的同步迁移到 Flexible Sync。 迁移是一个自动过程,无需对应用程序代码进行任何更改。 自动迁移需要 Realm .NET SDK 版本 11.1.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 Sync 订阅中使用。 例如,您可以添加
ownerId
属性,使用户能够仅同步自己的数据。删除自动Flexible Sync订阅并手动创建相关订阅。
有关 Flexible Sync 权限策略的示例,包括如何为这些策略进行数据建模的示例,请参阅Device Sync权限指南。
删除和手动创建订阅
当您从基于分区的同步迁移到Flexible Sync时,Realm 会自动为您的应用创建隐藏的Flexible Sync订阅。 下次添加或更改订阅时,我们建议您:
这样,您就可以在代码库中同时查看所有订阅逻辑,以便将来进行迭代和调试。
有关自动生成的Flexible Sync订阅的更多信息,请参阅将客户端应用程序迁移到Flexible Sync。
从非同步 Realm 迁移到同步 Realm
您可以将非同步域转换为同步域 (使用基于分区的同步)。 要从非同步域转换为使用基于分区的同步的 Realm,请执行以下操作:
打开现有域。
为新域创建配置。
对现有域调用WriteCopy()方法,将数据复制到新域。
在以下代码中,我们打开一个非同步域,创建一个新的PartitionSyncConfiguration对象,然后将现有域复制到新域。 然后,删除现有域并打开新域。
var existingConfig = new RealmConfiguration("example.realm"); var existingRealm = Realm.GetInstance(existingConfig); var app = App.Create("my-app-id"); var user = await app.LogInAsync( Credentials.EmailPassword("email@example.com", "password")); var syncConfig = new PartitionSyncConfiguration("user_partition", user); existingRealm.WriteCopy(syncConfig); // You can now delete the nonsynced realm: Realm.DeleteRealm(existingConfig); // You can now use the synced realm: var syncedRealm = Realm.GetInstance(syncConfig);
注意
仅限基于分区的同步
此方法仅支持在非同步 Realm 和基于分区的同步之间进行转换。如果应用程序使用“灵活同步”,则必须手动遍历一个 Realm 中的对象,并将其复制到另一个 Realm。