写入同步 Realm - .NET SDK
Overview
使用Flexible Sync将数据写入同步 Realm 时,您使用的 API 与写入本地 Realm 时相同。 但是,需要记住一些行为上的差异。
当您写入同步 Realm 时,写入操作必须匹配以下两项:
同步订阅查询
App Services App 中的权限
如果尝试写入与订阅查询和权限表达式不匹配的数据,写入操作将恢复并抛出 CompensatingWriteException 。 您可以查看App Services日志,详细了解写入被拒绝的原因。
补偿写入
当客户端尝试“非法”写入对象时,会发生以下情况:
由于客户端 Realm 没有“非法”写入的概念,因此写入最初会成功,直到 Realm 使用 App Services 后端解析变更集。
同步后,服务器会应用规则和权限。 服务器确定用户无权执行写入操作。
服务器向客户端发回恢复操作(称为“补偿写入”)。
客户端的域恢复非法写入操作并抛出
CompensatingWriteException
。
在非法写入和相应的补偿写入之间,客户端对对象的任何写入都将丢失。
实际上,这可能看起来像一个对象被写入域,然后在服务器将补偿写操作发送回客户端后消失。
抛出CompensatingWriteException
时,其中包含CompensatingWriteInfo对象的可枚举值。 每个CompensatingWriteInfo
对象都包含描述对象类型、主键以及服务器执行补偿写入原因的属性。
确定同步哪些数据
控制哪些数据可以写入同步的域的规则是 Device Sync 配置、App Services 权限以及打开域时使用的 Flexible Sync 订阅查询的交集。
让我们通过一个示例来了解这些组件是如何协同工作的:
Device Sync 配置
Device Sync 配置有以下可查询字段:
_id
(始终包含在内)ownerId
App Services 权限
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 订阅
客户端上的 Flexible Sync 订阅规定该对象的Status
值必须为“已完成”:
realm.Subscriptions.Update(() => { var completedItemsQuery = realm .All<MyTask>() .Where(i => i.Status == "completed"); realm.Subscriptions .Add(completedItemsQuery, new SubscriptionOptions() { Name = "completedItems" }); });
结果:哪些数据同步?
订阅查询和权限的组合意味着同步域仅同步符合以下条件的对象:
ownerId
user.id
与登录用户的 匹配(来自权限)Status
属性的值为“completed”(来自订阅查询)
Atlas collection中的任何对象,如果ownerId
与登录用户的user.id
不匹配,或者Status
属性的值不是“已完成”,则无法同步到此域。尝试写入此类对象会抛出CompensatingWriteException
。
如需了解更多信息,
要了解有关权限被拒绝错误、补偿写入错误和其他Device Sync 错误类型的更多信息,请参阅 Atlas App Services文档中的 同步错误 。
要了解有关为应用程序配置权限的更多信息,请参阅 Device SyncAtlas App Services文档中 的基于角色的权限 和 权限指南 。