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

基于分区的同步 - .NET SDK

在此页面上

  • 分区值
  • 在线时打开基于分区的 Sync Realm
  • 脱机时打开基于分区的同步 Realm
  • 从基于分区的同步迁移到 Flexible Sync
  • 迁移后更新客户端代码
  • 从非同步 Realm 迁移到同步 Realm

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

提示

Realm .NET SDK v 11.1.0及更高版本能力从基于分区的同步迁移到 Flexible Sync。 有关更多信息,请参阅: 从基于分区的同步迁移到 Flexible Sync 。 我们建议您迁移较旧的基于分区的同步应用程序,以使用Flexible Sync。

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

分区值决定客户端应用程序可以访问哪些数据。 您可以在打开同步 Realm 时传入分区值。

在线打开同步 Realm 的步骤如下:

  1. 您的应用代码将引导用户完成身份验证。

  2. 创建一个包含 分区值用户 对象的 PartitionSyncConfiguration 对象。

  3. 通过调用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);

提示

另请参阅:

用户完成身份验证后, 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);
}

您可以将 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:

  • PartitionSyncConfiguration更改为FlexibleSyncConfiguration。

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

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

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

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

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

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

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

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

您可以将非同步域转换为同步域 (使用基于分区的同步)。 要从非同步域转换为使用基于分区的同步的 Realm,请执行以下操作:

  1. 打开现有域。

  2. 为新域创建配置。

  3. 对现有域调用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。

后退

将数据流式传输至 Atlas