このページでは、同期されたデータベースを開く方法と、利用可能なさまざまな構成オプションについて説明します。
前提条件
クライアントから同期された Realm にアクセスする前に、次の操作を行う必要があります。
App Services UI で同期を有効にします。
Kotlin SDK for AndroidまたはKotlin マルチプラットフォームの同期ディストリビューションをインストールします。
クライアント プロジェクトでユーザーを認証します。
同期された Realm を開く
Flexible Syncレルムを開くには、ユーザーと Realm オブジェクト スキーマのセットをSyncConfiguration.Builder()に渡します。 次に、 initialSubscriptions()ビルダー メソッドを使用して一連の初期サブスクリプションを作成します。 最後に、構成をRealm.open()に渡して、Realm のインスタンスを開きます。
val app = App.create(YOUR_APP_ID) // use constants for query names so you can edit or remove them later val NAME_QUERY = "NAME_QUERY" runBlocking { val user = app.login(Credentials.anonymous()) val config = SyncConfiguration.Builder(user, setOf(Toad::class)) .initialSubscriptions { realm -> add( realm.query<Toad>( "name == $0", "name value" ), "subscription name" ) } .build() val realm = Realm.open(config) Log.v("Successfully opened realm: ${realm.configuration.name}") realm.close() }
Realm を初期サブスクリプションでブートストラップする方法と同期された Realm サブスクリプションの管理の詳細については、「同期サブスクリプションの管理 」を参照してください。
同期された Realm の構成
特定の構成設定を調整するには、 SyncConfiguration.Builderが提供するオプションを使用します。
val app = App.create(YOUR_APP_ID) runBlocking { val user = app.login(Credentials.anonymous()) val config = SyncConfiguration.Builder(user, setOf(Toad::class)) .maxNumberOfActiveVersions(10) .name("realm name") .initialSubscriptions { realm -> add( realm.query<Toad>( "name == $0", "name value" ), "subscription name" ) } .build() val realm = Realm.open(config) Log.v("Successfully opened realm: ${realm.configuration}") realm.close() }
バージョン 1.13.0 の新機能: 同期タイムアウト構成オプション を追加
Kotlin v1.13.0 では、同期操作に使用されるさまざまなデフォルトのタイムアウトを上書きできます。 これらのタイムアウトはAppクライアント構成で設定でき、アプリ内のすべての同期セッションに適用されます。 方法については、「同期タイムアウトの設定 」を参照してください。
開く前に変更をダウンロード
Kotlin SDK で同期された Realm を開くときに、 .waitForInitial remoteData() メソッドを使用できます function to download the changeset from your App before opening the realm. これを設定すると、すべてのデータがダウンロードされるまで、Realm が開くのをブロックします。 デバイスがオフラインの場合、これにより Realm を開くのがブロックされます。 最初のデータダウンロードは長時間かかる操作になる可能性があるため、バックグラウンド スレッドでこの設定を使用してRealmを開く必要があります。
この関数はタイムアウト期間 を受け入れます。ダウンロードがタイムアウト期間を超えると、 Realm はDownloadingRealmTimeoutException をスローします。
val user = app.login(Credentials.emailPassword(email, password)) val config = SyncConfiguration.Builder(user, setOf(Toad::class)) .waitForInitialRemoteData(60.seconds) .initialSubscriptions { realm -> add( realm.query<Toad>( "name == $0", "Jeremiah" ), "toads_named_jeremiah" ) } .build() val realm = Realm.open(config) Log.v("Successfully opened realm: ${realm.configuration}") // Query the realm we opened after waiting for data to download, and see that it contains data val downloadedToads: RealmResults<Toad> = realm.query<Toad>().find() Log.v("After downloading initial data, downloadedToads.size is ${downloadedToads.size}") realm.close()
開始する前に条件付きで変更をダウンロード
Realm を開く前にアプリがサーバー データをダウンロードするかどうかを決定する条件がある場合は、それをSyncSession. DownloadAllServerchanges()と併用して、Realm を開く前に条件付きで変更をダウンロードできます。 このメソッドを呼び出すと、既知のリモート変更がすべてダウンロードされ Realm に適用されるまで、または指定されたタイムアウトに達するまでブロックされます。 このメソッドは、UI 以外のスレッドからのみ呼び出す必要があります。
この関数はタイムアウト期間を受け入れます。
val user = app.login(Credentials.emailPassword(email, password)) val config = SyncConfiguration.Builder(user, setOf(Toad::class)) .initialSubscriptions { realm -> add( realm.query<Toad>( "name == $0", "Lollihops" ), "toads_named_lollihops" ) } .build() val realm = Realm.open(config) // Conditionally download data before using the realm based on some business logic if (downloadData) { realm.syncSession.downloadAllServerChanges(30.seconds) } // Query the realm we opened after waiting for data to download, and see that it contains data val downloadedToads: RealmResults<Toad> = realm.query<Toad>().find() Log.v("After conditionally downloading data, downloadedToads.size is ${downloadedToads.size}") realm.close()
同期された Realm をオフラインで開く
Realm アプリケーションはユーザーを認証する際、ユーザーの認証情報をキャッシュします。 既存のユーザー認証情報を確認して、ログイン フローをバイパスし、キャッシュされたユーザーにアクセスできます。 これを使用して、Realm をオフラインで開きます。
注意
最初のログインにはネットワーク接続が必要です
ユーザーがアプリにサインアップしたり、クライアントに既存のアカウントを使用して初めてログインする場合、クライアントにはネットワーク接続が必要です。 キャッシュされたユーザー認証情報を確認すると、ユーザーが以前にオンライン時にログインしたことがある場合にのみ、オフラインで Realm を開くことができます。
Realm を開く前にクライアントアプリで変更をダウンロードする必要がない場合にのみ、同期された Realm をオフラインで開くことができます。
// You can only open a synced realm offline if there is a cached user credential. If // there is no app.currentUser, you must log them in, which requires a network connection. if (app.currentUser == null) { app.login(Credentials.emailPassword(email, password)) } // If the app.currentUser isn't null, you can use the cached credential to open the synced // realm even if the user is offline. val user = app.currentUser!! val realm = Realm.open(config) // Query the realm we opened, and see that it contains data val offlineToads: RealmResults<Toad> = realm.query<Toad>().find() Log.v("After opening a realm offline, offlineToads.size is ${offlineToads.size}") realm.close()