同期された Realm への書き込み - .NET SDK
Overview
Flexible Sync を使用して同期された Realm にデータを書き込む場合、ローカル Realm に書き込むときに使用するのと同じ API を使用します。 ただし、動作にはいくつか注意すべき違いがあります。
同期された Realm に書き込む場合、書き込み操作は次の両方と一致する必要があります。
同期サブスクライブのクエリ
App Services App での権限
サブスクライブ クエリと権限式に一致しないデータを書込み (write) しようとすると、書込みは元に戻り、 CompensationsWriteExceptionがスローされます。 Atlas App Services のログで、書込みが拒否された理由の詳細を確認できます。
書込みの考慮
クライアントがオブジェクトに対して「不正」な書込みを試みると、次の状況が発生します。
クライアント Realm には「不正」書込みの概念が存在しないため、書込みは最初は Realm が App Services バックエンドで変更セットを解決するまで成功します。
同期時に、サーバーはルールと権限を適用します。 サーバーは、ユーザーには書込み (write) を実行する権限がないと判断します。
サーバーは、「書き込み補正」と呼ばれる元に戻す操作をクライアントに送信します。
クライアントの Realm は不正な書込み操作を元に戻し、
CompensatingWriteException
をスローします。
不正な書込みとそれに対応する代替書込みの間にあるオブジェクトに対するクライアント側の書込みはすべて失われます。
実際には、オブジェクトが Realm に書き込まれ、サーバーがクライアントに補完書込み (write) を送信した後に消えます。
CompensatingWriteException
がスローされると、 CompensingWriteInfoオブジェクトの列挙型が含まれます。 各CompensatingWriteInfo
オブジェクトには、オブジェクトタイプ、そのプライマリキー、サーバーが置換書込みを実行した理由を記述するプロパティが含まれています。
同期するデータの決定
同期された Realm に書き込むデータを制御するルールは、Device Sync 構成、App Services の権限、Realm を開くときに使用する 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" }); });
結果: 同期するデータは?
サブスクリプション クエリと 権限の組み合わせでは、同期された Realm は次のオブジェクトのみを同期します。
ownerId
はログインユーザーのuser.id
と一致します( 権限による)Status
プロパティの値は「完了」しています(サブスクライブ クエリから)
ownerId
がログインユーザーのuser.id
と一致しない、またはStatus
プロパティの値が「完了」していない Atlas コレクション内のオブジェクトは、この Realm に同期できません。 このようなオブジェクトを書込み (write) しようとすると、 CompensatingWriteException
がスローされます。
詳しくは、
権限拒否エラー、書込み (write) エラー、およびその他の Device Sync エラーのタイプの詳細については、App Services ドキュメントの「同期エラー 」を参照してください。
アプリの権限の設定の詳細については、App Services ドキュメントの「ロールベースの権限」および「 Device Sync 権限ガイド 」を参照してください。