Docs Menu
Docs Home
/ /
Atlas Device SDK
/ /

同期された Realm への書き込み - .NET SDK

項目一覧

  • Overview
  • 書込みの考慮
  • 同期するデータの決定
  • Device Sync の構成
  • App Services の権限
  • Flexible Sync サブスクライブ
  • 結果: 同期するデータは?
  • 詳しくは、

Flexible Sync を使用して同期された Realm にデータを書き込む場合、ローカル Realm に書き込むときに使用するのと同じ API を使用します。 ただし、動作にはいくつか注意すべき違いがあります。

同期された Realm に書き込む場合、書き込み操作は次の両方と一致する必要があります。

  • 同期サブスクライブのクエリ

  • App Services App での権限

サブスクライブ クエリと権限式に一致しないデータを書込み (write) しようとすると、書込みは元に戻り、 CompensationsWriteExceptionがスローされます。 Atlas App Services のログで、書込みが拒否された理由の詳細を確認できます。

クライアントがオブジェクトに対して「不正」な書込みを試みると、次の状況が発生します。

  1. クライアント Realm には「不正」書込みの概念が存在しないため、書込みは最初は Realm が App Services バックエンドで変更セットを解決するまで成功します。

  2. 同期時に、サーバーはルールと権限を適用します。 サーバーは、ユーザーには書込み (write) を実行する権限がないと判断します。

  3. サーバーは、「書き込み補正」と呼ばれる元に戻す操作をクライアントに送信します。

  4. クライアントの Realm は不正な書込み操作を元に戻し、 CompensatingWriteExceptionをスローします。

不正な書込みとそれに対応する代替書込みの間にあるオブジェクトに対するクライアント側の書込みはすべて失われます。

実際には、オブジェクトが Realm に書き込まれ、サーバーがクライアントに補完書込み (write) を送信した後に消えます。

CompensatingWriteExceptionがスローされると、 CompensingWriteInfoオブジェクトの列挙型が含まれます。 各CompensatingWriteInfoオブジェクトには、オブジェクトタイプ、そのプライマリキー、サーバーが置換書込みを実行した理由を記述するプロパティが含まれています。

同期された Realm に書き込むデータを制御するルールは、Device Sync 構成、App Services の権限、Realm を開くときに使用する 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" });
});

サブスクリプション クエリと 権限の組み合わせでは、同期された Realm は次のオブジェクトのみを同期します。

  • ownerIdはログインユーザーのuser.idと一致します( 権限による)

  • Statusプロパティの値は「完了」しています(サブスクライブ クエリから)

ownerIdがログインユーザーのuser.idと一致しない、またはStatusプロパティの値が「完了」していない Atlas コレクション内のオブジェクトは、この Realm に同期できません。 このようなオブジェクトを書込み (write) しようとすると、 CompensatingWriteExceptionがスローされます。

権限拒否エラー、書込み (write) エラー、およびその他の Device Sync エラーのタイプの詳細については、App Services ドキュメントの「同期エラー 」を参照してください。

アプリの権限の設定の詳細については、App Services ドキュメントの「ロールベースの権限」および「 Device Sync 権限ガイド 」を参照してください。

戻る

同期された Realm の構成とオープン