アプリに Device Sync を追加する - Kotlin SDK
項目一覧
このページでは、Device Sync、その基本的な概念、Realm Kotlin SDK を使用してクライアント アプリに Sync を追加する方法に関する情報が含まれています。 アプリに Sync を追加すると、クライアントから同期された Realm にアクセスできるようになります。
Device Sync についてすでに理解している場合 開始するには、 Atlas App Services で Device Sync を有効にする セクションに進んでください。
デバイスの同期
Device Syncは、クライアント デバイスと Atlas 間でデータを同期します。 オフラインでもデバイス上にデータは保持されます。 デバイスがネットワークに接続している場合、Device Sync はバックグラウンドでデータをアップロードおよびダウンロードし、競合の解決を管理します。
クライアント アプリと Atlas 間で同期されるデータは、適格なデータにアクセスするためのユーザーの権限によって決まります。 適格なデータは、次の共通部分です。
データモデル: データ型情報
サブスクリプション クエリ: 保存するデータを定義する条件
権限: 指定された条件を満たすデータを操作するために必要なロールベースの権限
Device Sync の詳細については、Atlas App Services ドキュメントの「 Atlas Device Sync を使い始める 」を参照してください。
データモデル
Device Sync データモデルは、同期できるオブジェクトタイプを定義します。 これにはクライアント側とサーバー側のスキーマが含まれています。
Realm スキーマ: Kotlin でデータを定義するクライアント アプリ内のオブジェクトモデル。
App Services schema : BSON でデータを定義する Atlas App Services のスキーマ。
データを同期するには、両方のスキーマが相互に整合性がある必要があります。
Device Sync データモデルは、最初にクライアント アプリで定義することも、最初に Atlas で定義することもできます。
クライアントアプリを通じてデータモデルを定義するには、まずクライアントアプリのコードでオブジェクトモデルを直接定義します。 次に、開発モードを使用して、一致する App Services スキーマを自動的に生成できます。 開発モードは 、クライアントからデータを同期するときに、Device Sync がクライアント側のデータモデルに基づいてスキーマを推論および更新できるようにする構成設定です。 「 App Services での Device Syncの有効化 」セクションでは、クライアントアプリで開発モードで Device Sync を有効にする方法について説明します。
Atlas にすでにデータがあり、まず Atlas を通じてデータモデルを定義する場合は、Atlas App Services ドキュメントの「クライアント アプリケーションを使用して Atlas のデータを同期する 」を参照してください。
注意
App Services におけるデータモデルのマッピング
クライアントと Atlas 間でデータをマッピングする方法の詳細については、「 Device Sync によるデータのモデル化 - Kotlin SDK 」を参照してください。
サブスクリプション
サブスクリプションは、データモデル内のオブジェクトに対するクライアント側のクエリです。 App Services はクエリに一致するオブジェクトのみを同期します。 クライアント アプリ内で複数のクエリを定義できます。 データモデル内の各オブジェクト型に対して少なくとも 1 つのクエリを定義する必要があります。
App Services は、 クエリ可能なフィールドを通じてクライアント側のクエリが App Services スキーマと一貫していることを確認します。 これらは、サブスクライブ クエリで使用できるデータモデルのフィールドです。 クエリ可能なフィールドにないフィールドを使用してサブスクリプションを定義することはできません。
開発モードが有効になっている場合、App Services はクライアント クエリに表示されるフィールドをクエリ可能なフィールドとして自動的に追加します。 App Services UI を使用して、クエリ可能なフィールドを手動で追加および削除することもできます。 詳細については、App Services ドキュメントの「クエリ可能なフィールド 」を参照してください。
ユーザー権限
App Services はロールベースの権限を使用して、ユーザーが読み取りおよび書込みできるデータを制御します。
ユーザーが読み取り権限を持つ場合、Device Sync はクライアントにサブスクライブ クエリに一致するデータをダウンロードします。
ユーザーが書込み権限を持つ場合、Atlas は同期されたデータへの書込みを許可し、ローカルに書込まれたデータをバックエンドにアップロードします。
App Services UI でロールを定義および管理できます。 同期を有効にすると、デフォルトのロールが選択されます。このロールは後で変更できるようになります。 詳細については、App Services ドキュメントの「ロールベースの権限」を参照してください。
前提条件
アプリに Device Sync を追加するには、アプリの状態とデータに応じて、いくつかの方法があります。 このガイドでは、開発モードを使用して既存のクライアント アプリに同期を追加する方法について説明します。 このガイドでは、アプリが Realm Kotlin SDK を使用しており、クライアント コードでデータモデルをすでに定義していることを前提としています。
Device Sync は Atlas App Services App を介してクライアント アプリを App Services バックエンドに接続するため、開始する前に次の操作を行う必要があります。
認証が有効になっている Atlas App Services App その方法については、App Services ドキュメントの「 App App Services Appの作成」を参照してください。
アプリが App Services バックエンドに接続できることを確認します。 方法については、「 Atlas App Services への接続 - Kotlin SDK 」を参照してください。
このページの例について
このページの例は、 Item
オブジェクトのリストを含む List
オブジェクトを含むすでに定義されたデータモデルを持つ Kotlin Todo アプリの例を参照しています。
class List : RealmObject { var _id: ObjectId = ObjectId() var name: String = "" var ownerId: String = "" var items: RealmList<Item> = realmListOf() } class Item : RealmObject { var _id: ObjectId = ObjectId() var name: String = "" var complete: Boolean = false }
App Services での Device Sync の有効化
クライアントアプリに同期を追加する前に、まず Atlas App Services アプリで Device Sync を有効にする必要があります。
アプリで Device Sync を有効にするには、App Services ドキュメントの「 Atlas Device Sync の構成と有効化」手順で説明されている手順を実行します。
このプロセス中に、開発モードを有効にするかどうかを選択でき、アプリユーザーのデフォルトロールを選択できます。 利用可能な設定の詳細については、App Services ドキュメントの「 同期設定」を参照してください。
Tip
最初に同期を有効にするときに開発モードを有効にし、その後アプリが本番環境に進む前に無効にすることをお勧めします。 詳しくは、App Services ドキュメントの「開発モード 」を参照してください。
このサンプルアプリでは、開発モードで Device Sync を有効にし、デフォルトの「ユーザーはすべてのデータの読み取りと書込みができる」デフォルトロールを追加しています。 つまり、ネットワーク接続を持つ承認されたユーザーの場合、Device Sync は適切なデータをクライアントにダウンロードし、 Atlas はクライアントへの書込みを許可し、それらをバックエンドと同期します。 承認されたユーザーがネットワークに接続していない場合にどのような影響があるかについて詳しくは、「書き込みの考慮事項 」を参照してください。
クライアント アプリへの同期の追加
Atlas App Services で同期を設定して有効にしたら、クライアント アプリに同期を追加できます。
Kotlin SDK の同期分散のインストール
Realm Kotlin SDK の同期ディストリビューションを含めるように依存関係を更新します。
App Services バックエンドへの接続
アプリ ID をApp
クライアントに渡してアプリを初期化します。 App Services UI からアプリ ID を取得するには、App Services ドキュメントの「 アプリ ID の検索 」を参照してください。
このサンプルアプリでは、アプリ ID を渡して、デフォルトの構成値でApp
を初期化します。
// Replace `YOUR_APP_ID` with your Atlas App ID val app = App.create(YOUR_APP_ID)
App Client へのアクセスと構成の詳細については、「 App Client を初期化する 」を参照してください。
ユーザーの認証
有効にした認証プロバイダーを使用して、クライアント アプリでユーザーを認証します。
このサンプルアプリでは、匿名認証を使用してユーザーをログインします。
// Authenticate the Atlas App Services user val myAuthenticatedUser = app.login(Credentials.anonymous())
アプリ内のユーザー認証の詳細については、「ユーザーの作成と認証 - Kotlin SDK 」を参照してください。
同期構成の定義
Device Sync では、同期された Realm を開くためにSyncConfigurationオブジェクトが必要です。 これは、同期されていない Realm を開くために使用されるRealmConfiguration
オブジェクトとは異なることに注意してください。
SyncConfiguration
オブジェクトには次のものが必要です。
ユーザー: 認証されたユーザー オブジェクト。
スキーマ: この Realm に含めるすべてのオブジェクトタイプ。
最初のサブスクリプション: 同期された Realm が最初に開かれたときに同期するデータを指定するサブスクリプション クエリ。 Realm が開かれた後、サブスクリプションを更新できます。 詳細については、「同期サブスクリプションの管理 - Kotlin SDK 」を参照してください。
追加の構成パラメーターについては、「 同期済み Realm の構成とオープン - Kotlin SDK 」を参照してください。
サンプル アプリでは、次の要素を含む 構成を定義しています。
オブジェクトと オブジェクトを含むスキーマ
List
Item
ユーザーが所有するすべての
List
オブジェクトとすべての不完全なItem
オブジェクトをクエリする初期サブスクリプション
// Define the configuration for the synced realm val config = // Pass the authenticated user and the set of // all objects types you want to be able to sync SyncConfiguration.Builder( user = myAuthenticatedUser, schema = setOf(List::class, Item::class) ) // Define an initial subscription with queries that include // the user's lists with incomplete items .initialSubscriptions{ realm -> add(realm.query<List>("ownerId == $0", myAuthenticatedUser.id), name = "user-lists" ) add(realm.query<Item>("complete = false"), name = "incomplete-items" ) } .build()
重要
スキーマ内のオブジェクト タイプ
同期構成スキーマには、同期済み Realm で操作するすべてのオブジェクトタイプを含める必要があります。 スキーマにないオブジェクトタイプのオブジェクトを参照または書込みしようとすると、Realm はスキーマ検証エラーを返します。
同期された Realm を開く
定義された構成を使用して、同期された Realm を開きます。 Realm が正常に開かれると、最初のサブスクリプション クエリによってクライアントに同期するデータが決定されます。 開発モードが有効になっている場合、App Services はスキーマで定義されたクエリに基づいて、クエリ可能なフィールドを自動的に追加します。
このサンプルアプリでは、 config
オブジェクトをrealm.open()
に渡して同期された Realm を開き、サブスクリプションがバックエンドと同期されるのを待ちます。
// Open the synced realm with the defined configuration val realm = Realm.open(config) Log.v("Successfully opened synced realm: ${realm.configuration.name}") // Wait for initial subscriptions to sync to Atlas realm.subscriptions.waitForSynchronization()
開発モードが有効になっているため、App Services は初期サブスクリプションに基づいてクエリ可能なフィールドとして次のものが自動的に追加されました。
_id
(常に含まれる)ownerId
complete
Realm の使用
構成された同期済み Realm が開かれたら、Realm 内のデータを操作できるようになります。 ローカル データを操作している間に、バックグラウンド スレッドが変更セットを効率的に統合、アップロード、ダウンロードします。
読み取り、書込み、変更の監視の構文は、同期されていない Realm の構文と同じです。 ただし、同期された Realm にデータを書き込む際には、追加の考慮事項があります。 詳細については、「 同期された Realm へのデータの書き込み - Kotlin SDK 」を参照してください。
サンプルアプリでは、新しい オブジェクトとList
Item
オブジェクトを記述し、それらを同期された Realm にコピーします。
// Write List and Item objects to the synced realm // Objects that match the subscription query are synced to Atlas realm.write { val list = List().apply { name = "My Todo List" ownerId = myAuthenticatedUser.id items.add(Item().apply { name = "Check email" complete = false }) } copyToRealm(list) } realm.syncSession.uploadAllLocalChanges(30.seconds)
オブジェクトはデバイスに正常に書込まれ、Atlas に同期されます。その理由は次のとおりです。
どちらのオブジェクトもサブスクライブ クエリのパラメーター内にあります(
List
はユーザーが所有し、Item
は不完全です)。現在のユーザーにはバックエンドへのデータの書込み (write) 権限があります( ロールにより、権限のあるユーザーはすべてのデータの読み取りと書込みを許可されます)。
書込み (write) 操作がクエリと一致しなかった場合、または現在のユーザーに必要な権限が ない 場合、Realm は 補完書込み (write) と呼ばれる致命的でないエラー操作で書込みを元に戻します。
次のステップ
アプリが必要なデータを Atlas に正常に同期すると、 Kotlin SDK で同期 の使用方法について詳しく知ることができます。
同期された Realm を設定して開きます - Kotlin SDK : デバッグ アプリ名の設定、カスタム リクエスト ヘッダーの提供、ディスパッチの指定など、利用可能なアプリ クライアント構成オプションについて学習します。
同期サブスクリプションの管理 - Kotlin SDK : アプリでサブスクライブ クエリを定義および管理する方法を学びます。
同期された Realm へのデータの書込み - Kotlin SDK : 同期された Realm への書込み方法、書込みエラーの修正の処理方法、パフォーマンスを向上させるために書込みをグループ化する方法について詳しく説明します。
同期セッションの管理 - Kotlin SDK : 同期セッションを通じて App Services との通信を管理する方法を学びます。
同期エラーの処理 - Kotlin SDK : クライアントのリセットなど、発生する可能性のある同期エラーを処理する方法を学びます。