Docs Menu
Docs Home
/ /
Atlas Device SDK
/ /

アプリに Device Sync を追加する - Kotlin SDK

項目一覧

  • デバイスの同期
  • データモデル
  • サブスクリプション
  • ユーザー権限
  • 前提条件
  • このページの例について
  • App Services での Device Sync の有効化
  • クライアント アプリへの同期の追加
  • Kotlin SDK の同期分散のインストール
  • App Services バックエンドへの接続
  • ユーザーの認証
  • 同期構成の定義
  • 同期された Realm を開く
  • Realm の使用
  • 次のステップ

このページでは、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 バックエンドに接続するため、開始する前に次の操作を行う必要があります。

  1. 認証が有効になっている Atlas App Services App その方法については、App Services ドキュメントの「 App App Services Appの作成」を参照してください。

  2. アプリが App Services バックエンドに接続できることを確認します。 方法については、「 Atlas App Services への接続 - Kotlin SDK 」を参照してください。

このページの例は、 Itemオブジェクトのリストを含む Listオブジェクトを含むすでに定義されたデータモデルを持つ Kotlin Todo アプリの例を参照しています。

ToDo アプリのデータモデルの例
class List : RealmObject {
@PrimaryKey
var _id: ObjectId = ObjectId()
var name: String = ""
var ownerId: String = ""
var items: RealmList<Item> = realmListOf()
}
class Item : RealmObject {
@PrimaryKey
var _id: ObjectId = ObjectId()
var name: String = ""
var complete: Boolean = false
}

クライアントアプリに同期を追加する前に、まず 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 で同期を設定して有効にしたら、クライアント アプリに同期を追加できます。

1

Realm Kotlin SDK の同期ディストリビューションを含めるように依存関係を更新します

2

アプリ 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 を初期化する 」を参照してください。

3

有効にした認証プロバイダーを使用して、クライアント アプリでユーザーを認証します。

このサンプルアプリでは、匿名認証を使用してユーザーをログインします。

// Authenticate the Atlas App Services user
val myAuthenticatedUser = app.login(Credentials.anonymous())

アプリ内のユーザー認証の詳細については、「ユーザーの作成と認証 - Kotlin SDK 」を参照してください。

4

Device Sync では、同期された Realm を開くためにSyncConfigurationオブジェクトが必要です。 これは、同期されていない Realm を開くために使用されるRealmConfigurationオブジェクトとは異なることに注意してください。

SyncConfigurationオブジェクトには次のものが必要です。

  • ユーザー: 認証されたユーザー オブジェクト。

  • スキーマ: この Realm に含めるすべてのオブジェクトタイプ。

  • 最初のサブスクリプション: 同期された Realm が最初に開かれたときに同期するデータを指定するサブスクリプション クエリ。 Realm が開かれた後、サブスクリプションを更新できます。 詳細については、「同期サブスクリプションの管理 - Kotlin SDK 」を参照してください。

追加の構成パラメーターについては、「 同期済み Realm の構成とオープン - Kotlin SDK 」を参照してください。

サンプル アプリでは、次の要素を含む 構成を定義しています。

  • オブジェクトと オブジェクトを含むスキーマListItem

  • ユーザーが所有するすべての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 はスキーマ検証エラーを返します。

5

定義された構成を使用して、同期された 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 へのデータの書き込み - 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 で同期 の使用方法について詳しく知ることができます。

戻る

同期デバイス データ