同期された Realm を構成して開く - .NET SDK
項目一覧
同期された Realm
Realm を構成して、それぞれがデータのローカル コピーを持つ多数のデバイス間でデータを自動的に同期できます。 同期された Realm はローカル専用の Realm とは異なる構成を使用するため、同期プロセスを処理するには Atlas App Services バックエンド が必要です。
アプリケーションは、オフラインでも、ローカルで同期された Realm オブジェクトをいつでも作成、変更、削除できます。 ネットワーク接続が利用可能になるたびに、Realm SDK はアプリケーション サーバーへの接続を開き、他のクライアントとの間での変更を同期します。 Atlas Device Sync プロトコルとサーバー側の運用変換では、特定の変更がオフラインで発生したり、正しい順序で受信されなかった場合でも、Realm の完全に同期されたすべてのインスタンスが完全に同じデータを参照することが保証されます。
Tip
同期の設定と使用方法を学ぶ
Device Syncで同期を設定する方法など、 の詳細については、「App Services App デバイス間のデータ同期 -.NET SDK 」を参照してください。
同期された Realm と同期されていない Realm
同期された Realm と同期されていないローカル Realm とはいくつかの違いがあります。
同期された Realm ではバックエンドの App Services Appと変更が同期されようとしますが、同期されていない Realm では変更が同期されません。
同期された Realm には認証済みユーザーがアクセスできますが、同期されていない Realm にはユーザーや認証の概念がありません。
同期されていない Realm から同期された Realm に、またはその逆にデータをコピーすることはできますが、同期されていない Realm を同期することはできません。
同期された Realm と同期されていない Realm の変換
同期されていない Realm を同期された Realm に変換するには、「ローカル専用アプリの同期可能なアプリへの移行」で説明されているプロセスに従います。 .NET SDK はWriteCopy()メソッドも提供しており、このメソッドを使用すると同期されていない Realm のデータを同期 Realm に複製できます。 詳細については、 「 同期されていない Realm から同期された Realm への移行 」を参照してください。
注意
パーティションベースの同期のみ
このメソッドは、非同期 Realm と パーティションベースの同期 との間の変換のみをサポートします。 アプリで Flexible Sync を使用する場合は、一方の Realm 内のオブジェクトを手動で反復処理し、もう一方の Realm にコピーする必要があります。
同期された Realm
同期された Realm を開くには、認証されたユーザーオブジェクト が必要です。 最初の User
インスタンスを取得するには、Atlas App Services バックエンドに対して認証する必要があります。このため、ユーザーが初めてログインするときにデバイスがオンラインである必要があります。 初期認証が発生したら、オフラインでも既存のユーザーを検索できます。
注意
ユーザーが初めてアプリにログオンするときは、Realm を非同期に開き、バックグラウンド スレッドでサーバーからデバイスにデータを同期する必要があります。 この最初の同期後に、Realm を同期的に開き、アプリがオフラインの状態で動作することを確認できます。
同期された Realm を開く
同期された Realm を開くための通常のフローは、次のとおりです。
同期構成の作成。
ユーザーの同期された Realm を 構成で起動します。
認証時に、ユーザー認証情報をデバイス上のsync_metadata.realm
ファイルにキャッシュします。
認証後に同期された Realm を開くと、ログイン フローをバイパスし、すでに作成した同じ同期構成を使用して同期された Realm を開くことができGo 。
キャッシュされた認証情報を使用すると、次のことが可能になります。
デバイス上のデータと同期された Realm をすぐに開きます。 このメソッドはオフラインでもオンラインでも使用できます。
アプリから変更をダウンロードした後、同期された Realm を開きます。 これには、ユーザーがアクティブなインターネット接続を持っている必要があります。
オンライン中に同期された Realm を開く
オンライン中に同期された Realm を開く手順は次のとおりです。
アプリ コードでは、ユーザーの認証手順を説明します。
ユーザー オブジェクトを含む FlexibleSyncConfiguration オブジェクトを作成します。
GetInstanceAsync()メソッドを呼び出して、同期された Realm を開きます。
FlexibleSyncConfiguration に初期サブスクリプションが含まれていない場合は、サブスクライブを追加します。
次のコードは、これらの手順を示しています。
var app = App.Create("myRealmAppId"); var user = await app.LogInAsync(Credentials.Anonymous()); Realm realm; var config = new FlexibleSyncConfiguration(user) { PopulateInitialSubscriptions = (realm) => { var allTasks = realm.All<MyTask>(); realm.Subscriptions.Add(allTasks, new SubscriptionOptions { Name = "allTasks" }); } }; try { realm = await Realm.GetInstanceAsync(config); } catch (Exception ex) { Console.WriteLine($@"Error creating or opening the realm file. {ex.Message}"); }
上記の例では、コードはGetInstanceAsync()
を呼び出して Realm を非同期に開く方法を示しています。 GetInstance() メソッドを呼び出して、Realm を 同期 的に開くこともできます。
var synchronousRealm = Realm.GetInstance(config);
オフライン時に同期された Realm を開く
ユーザーが認証を行うと、ユーザーがログオフするまでUser
オブジェクトはデバイス上に保持されます。 これにより、アプリは既存のユーザーを取得し、オフラインの状態で同期された Realm を開くことができます。 オフライン中に発生した変更は、デバイスがアプリに再接続すると、SDK によって同期されます。
次のコードは、既存のUser
オブジェクトがあるかどうかを確認する方法を示しています。 何も見つからない場合は、 について説明されているプロセスを使用してユーザーを取得します。 デバイスにすでにuser
がある場合は、そのユーザーと同期された Realm が開きます。
var app = App.Create("myRealmAppId"); Realms.Sync.User user; FlexibleSyncConfiguration config; Realm realm; if (app.CurrentUser == null) { // App must be online for user to authenticate user = await app.LogInAsync(Credentials.Anonymous()); config = new FlexibleSyncConfiguration(user); realm = Realm.GetInstance(config); // Go on to add or update subscriptions and use the realm } else { // This works whether online or offline // It requires a user to have been previously authenticated user = app.CurrentUser; config = new FlexibleSyncConfiguration(user); realm = Realm.GetInstance(config); // Go on to add or update subscriptions and use the realm }
AppConfiguration によるタイムアウトの構成
アプリ接続をより細かく制御するには、 AppConfiguration オブジェクトの SyncTimeoutOptions を設定します。次の同期タイムアウト プロパティを設定できます。
ConnectTimeout
: 接続が完全に確立されるまでの時間の長さ。ConnectionLingerTime
: すべてのセッションが破棄された後に接続を開いたままにしておく時間。PingKeepAlivePeriod
: 各ハートビート ping メッセージ間の時間量PongKeepAliveTimeout
: 接続が切断されたと判断する前に、ハートビート ping への応答を待つ時間。FastReconnectLimit
: 以前の接続が失われてから、新しい接続が「高速再接続」と見なされるまでの時間。
AppConfiguration configuration = new AppConfiguration("myRealmAppId") { SyncTimeoutOptions = new SyncTimeoutOptions() { ConnectTimeout = TimeSpan.FromMinutes(2), ConnectionLingerTime = TimeSpan.FromSeconds(30), PingKeepAlivePeriod = TimeSpan.FromMinutes(1), PongKeepAliveTimeout = TimeSpan.FromMinutes(1), FastReconnectLimit = TimeSpan.FromMinutes(1), }, };
Realm のスコープ設定
Realm インスタンスは、ネイティブ リソースが解放されるようにするためにIDisposable
を実装します。 Realm オブジェクトは、使用後すぐに、特にバックグラウンド スレッドで破棄する必要があります。 これを行う最も簡単な方法は、 using
ステートメントで Realm オブジェクトを宣言するか、Realm を操作するコードをusing (...)
ステートメントでラップします。
config = new PartitionSyncConfiguration("myPart", user); using (var realm = Realm.GetInstance(config)) { var allItems = realm.All<Item>(); }
Realm オブジェクトを単一のメソッドの外部で共有する必要がある場合は、 Dispose()メソッドを呼び出してその状態を管理するようにしてください。
realm.Dispose();
注意
一般に、Realm はバックグラウンド スレッドでのみ破棄する必要があります。Realm を破棄すると、そのインスタンスに関連付けられているすべてのオブジェクトが無効になるためです。 たとえば、メイン スレッドで Realm オブジェクトをデータにバインディングする場合は、 Dispose()
を呼び出しないでください。
クラス サブセット
デフォルトでは、すべてのRealmObject
クラスは Realm に保存されます。 場合によっては、保存されるクラスを制限する必要がある場合があります。これは、 RealmConfiguration
オブジェクトのスキーマプロパティで可能です。 次のコードは、Realm に保存する 2 つのクラスを指定する方法を示しています。
var config = new RealmConfiguration() { Schema = new Type[] { typeof(AClassWorthStoring), typeof(AnotherClassWorthStoring) } };