10. オブジェクトストレージ(オフライン)

ここではオブジェクトストレージのオフライン機能の利用方法について説明します。

10.1. オフラインバケットインスタンスの生成

オフラインオブジェクトストレージを使用する場合は、最初にオフラインバケットを作成する 必要があります。

オフラインバケットに対する読み書き操作は、すべてクライアントのローカルデータベース に対する操作となり、サーバにはデータは送信されません。 サーバとデータをやりとりするためには、サーバ上のバケットとローカルバケットを「同期」 することになります。

オフラインバケットは、NbOfflineObjectBucket クラスのインスタンスとして生成します。 引数にバケット名を指定して NbOfflineObjectBucket を生成します。

var offlineEmpBucket = new NbOfflineObjectBucket<NbOfflineObject>("Employee");

10.2. オブジェクトの操作

オブジェクトの操作方法は、オンラインのときの方法とほとんど同じですが、 NbObject の代わりに NbOfflineObject を使う必要があります。

以下、例を示します。

var obj = offlineEmpBucket.NewObject();
// または var obj = new NbOfflineObject("Employee");

obj["name"] = "Taro Nichiden";
obj["email"] = "taro@example.com";
obj["age"] = 27;

var resultObj = await obj.SaveAsync();

10.3. アクセス制御

アクセス制御も、オンラインの場合とほぼおなじです。 オブジェクトの ACL に対してアクセス制限が行われます。 ただし、オフラインバケットには ACL の概念がないため、アクセス制限は行われません。

10.4. NbOfflineObject のサブクラス化

NbOfflineObject も NbObject と同様にサブクラス化することができます。

10.5. 同期

クライアント上のオフラインバケットのデータをサーバ上のオンラインバケットと同期させることができます。同期では前回同期から更新のあった差分データのみを同期します。

同期処理では、下記 1, 2 の処理を行います。

  1. サーバ側で更新のあったデータを受信 (Pull)
  2. クライアント側で更新したデータをサーバへ送信 (Push)

処理 1. については、以下に述べるように同期範囲を設定しておくことができます。

オフライン時にクライアント側で更新したデータを、オンライン時にサーバへ送信する手段が必要となるため、 処理 2. では、同期範囲の指定に関係なく、クライアント側で更新のあったデータは全てサーバに送信されます。

同期を行うには、同期マネージャの NbObjectSyncManager クラスを使用します。

10.5.1. 同期範囲の設定

同期に先立ち、「同期範囲」を指定する必要があります。これはサーバ側データをクライアント側に同期する際に使用されます。

以下に例を示します。

// 同期マネージャインスタンスを生成
var syncManager = new NbObjectSyncManager();

// 同期範囲を設定
if (syncManager.GetSyncScope("Employee") == null) {
    syncManager.SetSyncScope("Employee", new NbQuery());
}

同期範囲は SetSyncScope で設定します。条件はクエリ(NbQuery)で指定します。すなわち、特定条件に合致したデータだけを同期することが可能です。上記例ではバケット "Employee" に対して、全範囲を同期するという設定を行っています。

なお、設定した同期範囲はローカルデータベース上に永続化されます。 同期範囲が設定済みかどうかは GetSyncScope で確認できます。

注意

同期範囲を設定・変更すると同期条件(最終同期時刻)がクリアされ、次回同期を行う際はかならず全同期になってしまう(差分同期にならない)ので、注意してください。

10.5.2. 同期の実行

同期実行には SycnBucketAsync メソッドを使用します。

// 同期を実行
var result = await syncManager.SyncBucketAsync("Employee", NbObjectConflictResolver.PreferServerResolver);

SyncBucketAsync に同期を行うバケット名と衝突解決ポリシを指定します。

衝突解決ポリシは、データの衝突が発生したときにこれを解決する方法です。には以下の2通りがあります。

  • PreferServerResolver: 常にサーバ側のデータを優先してローカルDBのデータを更新します。
  • PreferClientResolver: 常にクライアント側のデータを優先してサーバ側の該当データを更新します。

戻り値には、同期に失敗したオブジェクト一覧が IList<NbBatchResult> 型で返却されます。 NbBatchResult 内の ResultCode に原因が設定されていますので、適宜処理してください。 同期が完全に成功した場合は返り値の件数は 0 になります。

注意

衝突解決ポリシを PreferClientResolver に指定して同期した場合、 サーバ側で同時に更新が行われるとオブジェクトが衝突状態のまま残る場合があります。 この場合は戻り値に衝突したオブジェクト一覧が返されます (ResultCode は Conflict になります)。 衝突状態を解決するためには再度同期を実行してください。

10.5.3. キャッシュの全クリア

前回ログインしたユーザと異なるユーザで利用する場合などに、 同期済みデータを一旦すべて削除することができます。

await NbOfflineSerfvice.DeleteCacheAll();

本 API を呼び出すと、すべてのオフラインバケットとオフラインバケット内の同期データが消去されます。 また、設定した同期範囲と最終同期時刻もクリアされます。

まだサーバに同期していないデータもすべて消去されますので、ご注意ください。