将 Device Sync 添加到应用程序 - Kotlin SDK
在此页面上
本页包含有关 Device Sync、其基本概念以及如何使用 Realm Kotlin SDK 将 Sync 添加到客户端应用程序的信息。 将 Sync 添加到应用程序后,您可以从客户端访问同步 Realm。
已经熟悉Device Sync了? 向前跳至 “在App Services中启用Device Sync ”部分以开始使用。
设备同步
Device Sync在客户端设备和Atlas之间同步数据。 即使离线,数据也会持久保存在设备上。 当设备有网络连接时, Device Sync会在背景上传和下载数据并管理冲突解决。
在客户端应用和Atlas之间同步的数据取决于用户访问权限合格数据的权限。 符合条件的数据是以下各项的交集:
数据模型:数据类型信息
订阅查询:定义要存储哪些数据的条件
权限:与满足指定条件的数据进行交互所需的基于角色的权限
有关Device Sync的详细说明,请参阅Atlas App Services文档中的Atlas Device Sync入门。
数据模型
Device Sync 数据模型定义了可以同步的对象类型。 它包含客户端和服务器端模式:
Realm模式:客户端应用中的对象模型,用于在Kotlin中定义数据。
Atlas App Services模式: Atlas App Services BSON定义数据的模式。
两个模式必须一致才能同步数据。
您可以先在客户端应用或Atlas中定义Device Sync数据模型:
要通过客户端应用定义数据模型,请首先直接在客户端应用代码中定义对象模型。 然后,您可以使用开发模式自动生成匹配的App Services模式。 开发模式是一种配置设置,当您从客户端同步数据时,允许Device Sync根据客户端数据模型推断和更新模式。 在App Services中启用Device Sync部分描述了如何在客户端应用中使用开发模式启用Device Sync 。
如果Atlas中已有数据,并且希望首先通过Atlas定义数据模型,请参阅App Services文档中的使用客户端应用程序同步Atlas中的数据。
订阅
订阅是对数据模型中对象的客户端查询。 Atlas App Services仅同步与查询匹配的对象。 您可以在客户端应用程序中定义多个查询。 您必须为数据模型中的每种对象类型定义至少一个查询。
Atlas App Services通过Atlas App Services 可查询字段 确保客户端查询与 模式一致。这些是数据模型中可用于订阅查询的字段。 您无法使用不在可查询字段中的字段定义订阅。
启用开发模式后, Atlas App Services会自动将客户端查询中显示的字段添加为可查询字段。 您还可以通过Atlas App Services用户界面手动添加和删除可查询字段。 有关更多信息,请参阅 Atlas App Services文档中的可查询 字段 。
用户权限
App Services使用基于角色的权限来控制用户可以读取和写入的数据:
当用户具有读取权限时,Device Sync 会将与订阅查询匹配的数据下载到客户端。
当用户具有写入权限时, Atlas允许写入同步数据并将本地写入的数据上传到后端。
您可以在Atlas App Services用户界面中定义和管理角色。 启用同步时,您可以选择一个默认角色,稍后可以对其进行修改。 有关更多信息,请参阅 Atlas App Services文档中 的基于角色的权限 。
先决条件
您可以通过多种方式将 Device Sync 添加到应用程序,具体取决于应用程序和数据的状态。 本指南介绍如何使用开发模式将同步添加到现有客户端应用程序。 本指南假定您的应用使用 Realm Kotlin SDK,并且您已经在客户端代码中定义了数据模型。
由于Device Sync通过Atlas App Services应用程序将客户端应用程序连接到Atlas App Services后端,因此在开始之前,您需要执行以下操作:
启用身份验证的 Atlas App Services App。 要了解如何操作,请参阅 App Services AppAtlas App Services文档中的 创建 。
确认您的应用可以连接到Atlas App Services后端。 要了解操作方法,请参阅连接到 Atlas App Services - Kotlin SDK。
关于本页中的示例
本页上的示例指的是一个示例 Kotlin Todo 应用,该应用具有已定义的Realm 数据模型,其中包括一个 List
对象,而该对象包含Item
对象列表:
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 App 中启用 Device Sync,然后才能将 Sync 添加到客户端应用程序。
Device Sync要在您的应用中启用 Atlas Device Sync,请完成Atlas App Services 文档中 配置和启用 过程中概述的步骤。
在此进程,您可以选择是否启用开发模式,也可以为应用用户选择默认角色。 有关可用设置的详细信息,请参阅App Services文档中的同步设置。
对于我们的示例应用,我们在开发模式下启用Device Sync ,然后添加默认的“用户可以读取和写入所有数据”默认角色。 这意味着,对于具有网络连接的授权用户, Device Sync会将符合条件的数据下载到客户端, Atlas允许写入到客户端,然后将其同步到后端。 要详细学习;了解授权用户没有网络连接时会发生什么情况,请参阅补偿写入。
将 Sync 添加到客户端应用程序
在 Atlas App Services 中配置并启用 Sync 后,您可以将 Sync 添加到客户端应用程序。
安装 Kotlin SDK 的同步发行版
更新您的依赖项以包含Realm Kotlin SDK的 Sync 发行版。
验证用户身份
使用已启用的身份验证提供程序在客户端应用程序中对用户进行身份验证。
对于我们的示例应用,我们使用匿名身份验证登录用户:
// Authenticate the Atlas App Services user val myAuthenticatedUser = app.login(Credentials.anonymous())
有关在应用中对用户进行身份验证的更多信息,请参阅创建和验证用户 - Kotlin SDK。
定义同步配置
Device Sync需要SyncConfiguration对象来打开同步域。 请注意,这与用于打开非同步域的RealmConfiguration
对象不同。
SyncConfiguration
对象需要满足以下条件:
User :经过身份验证的用户对象。
模式:您想要在此 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 后,初始订阅查询会确定要同步到客户端的数据。 如果启用了开发模式, Atlas 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 - Kotlin SDK。
对于示例应用,我们写入新的List
和Item
对象,然后将它们复制到同步域:
// 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
不完整)。当前用户有向后端写入数据的权限(角色允许授权用户读取和写入所有数据)。
如果我们的写入操作与查询不匹配,或者当前用户没有必要的权限, Realm就会使用称为补偿写入。
后续步骤
应用成功将所需数据同步到 Atlas 后,您可以详细了解如何通过 Kotlin SDK 使用 Sync:
配置并打开同步Realm - Kotlin SDK :了解可用的应用客户端配置选项,例如设置调试应用名称、提供自定义请求标头或指定调度程序。
管理同步订阅 - Kotlin SDK :了解如何在应用中定义和管理订阅查询。
将数据写入同步Realm - Kotlin SDK :了解详情了解如何写入同步域、如何处理补偿写入错误以及如何对写入进行群组以提高性能。
管理同步会话 - Kotlin SDK :了解如何通过同步会话管理与App Services的通信。
处理同步错误 - Kotlin SDK :了解如何处理可能发生的同步错误,包括客户端重置。