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

写入同步 Realm - .NET SDK

在此页面上

  • Overview
  • 补偿写入
  • 确定同步哪些数据
  • Device Sync 配置
  • App Services 权限
  • Flexible Sync 订阅
  • 结果:哪些数据同步?
  • 如需了解更多信息,

使用Flexible Sync将数据写入同步 Realm 时,您使用的 API 与写入本地 Realm 时相同。 但是,需要记住一些行为上的差异。

当您写入同步 Realm 时,写入操作必须匹配以下两项

  • 同步订阅查询

  • App Services App 中的权限

如果尝试写入与订阅查询和权限表达式不匹配的数据,写入操作将恢复并抛出 CompensatingWriteException 。 您可以查看App Services日志,详细了解写入被拒绝的原因。

当客户端尝试“非法”写入对象时,会发生以下情况:

  1. 由于客户端 Realm 没有“非法”写入的概念,因此写入最初会成功,直到 Realm 使用 App Services 后端解析变更集。

  2. 同步后,服务器会应用规则和权限。 服务器确定用户无权执行写入操作。

  3. 服务器向客户端发回恢复操作(称为“补偿写入”)。

  4. 客户端的域恢复非法写入操作并抛出 CompensatingWriteException

在非法写入和相应的补偿写入之间,客户端对对象的任何写入都将丢失。

实际上,这可能看起来像一个对象被写入域,然后在服务器将补偿写操作发送回客户端后消失。

抛出CompensatingWriteException时,其中包含CompensatingWriteInfo对象的可枚举值。 每个CompensatingWriteInfo对象都包含描述对象类型、主键以及服务器执行补偿写入原因的属性。

控制哪些数据可以写入同步的域的规则是 Device Sync 配置、App Services 权限以及打开域时使用的 Flexible Sync 订阅查询的交集。

让我们通过一个示例来了解这些组件是如何协同工作的:

Device Sync 配置有以下可查询字段:

  • _id (始终包含在内)

  • ownerId

App Services App 的权限配置为仅允许用户读取和写入自己的数据:

{
"name": "owner-read-write",
"apply_when": {},
"document_filters": {
"read": { "ownerId": "%%user.id" },
"write": { "ownerId": "%%user.id" }
},
"read": true,
"write": true
}

客户端上的 Flexible Sync 订阅规定该对象的Status值必须为“已完成”:

realm.Subscriptions.Update(() =>
{
var completedItemsQuery = realm
.All<MyTask>()
.Where(i => i.Status == "completed");
realm.Subscriptions
.Add(completedItemsQuery,
new SubscriptionOptions() { Name = "completedItems" });
});

订阅查询和权限的组合意味着同步域仅同步符合以下条件的对象:

  • ownerIduser.id与登录用户的 匹配(来自权限)

  • Status属性的值为“completed”(来自订阅查询)

Atlas collection中的任何对象,如果ownerId与登录用户的user.id不匹配,或者Status属性的值不是“已完成”,则无法同步到此域。尝试写入此类对象会抛出CompensatingWriteException

要了解有关权限被拒绝错误、补偿写入错误和其他Device Sync 错误类型的更多信息,请参阅 Atlas App Services文档中的 同步错误 。

要了解有关为应用程序配置权限的更多信息,请参阅 Device SyncAtlas App Services文档中 的基于角色的权限 和 权限指南 。

后退

配置和打开已同步 Realm