You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android应用MongoDB Realm Flexible Sync无法同步至服务器求助

Realm本地数据持久化成功但无法同步到服务器的问题排查与修复

你当前的Realm待办应用本地数据已创建,但无法同步至服务器,以下是遗漏的关键配置和步骤:

1. 明确配置SyncConfiguration的同步模型与初始订阅

默认的SyncConfiguration.defaultConfig(user)未明确指定要同步的模型类,导致Realm无法确定需要同步的集合。修改setupRealm方法:

private fun setupRealm() {
    val config = SyncConfiguration.Builder(user, setOf(Item::class.java)) // 指定同步的模型类
        .initialSubscriptions { realm, subscriptions ->
            // 初始化订阅,确保本地与服务器的查询规则一致
            subscriptions.addOrUpdate(
                Subscription.create("todos", realm.where(Item::class.java))
            )
        }
        .build()
    realm = Realm.getInstance(config)
    realm.addChangeListener { updateUi() }
    // 无需单独调用subscribe,初始订阅已配置
}

2. 服务器端配置正确的Flexible Sync权限规则

在MongoDB Atlas App Services中,必须为Item集合配置匹配的权限规则,确保匿名用户能读写自己的待办项:

  • 进入你的Realm应用 → 左侧菜单Rules → 找到对应集合
  • 设置权限规则为:
    {
      "owner_id": "%%user.id"
    }
    
  • 同时确认Flexible Sync已启用,且集合已被正确关联到Realm应用。

3. 等待订阅与同步完成后再操作数据

当前订阅更新后直接调用updateUi,但订阅和同步需要与服务器交互的时间,需监听订阅结果并等待初始同步完成:

// 若保留单独的subscribe方法,修改为:
private fun subscribe() {
    realm.subscriptions.updateAsync({
        it.addOrUpdate(Subscription.create("todos", realm.where(Item::class.java)))
    }) { result ->
        if (result.isSuccess) {
            // 等待初始远程数据同步完成
            realm.waitForInitialRemoteData()
            updateUi()
        } else {
            println("__print::订阅失败: ${result.error.errorMessage}")
        }
    }
}

4. 添加同步状态监听排查错误

添加同步会话的监听器,可直接查看同步过程中的连接状态、上传/下载进度及错误信息:

private fun setupRealm() {
    val config = SyncConfiguration.Builder(user, setOf(Item::class.java))
        .initialSubscriptions { realm, subscriptions ->
            subscriptions.addOrUpdate(Subscription.create("todos", realm.where(Item::class.java)))
        }
        .build()
    realm = Realm.getInstance(config)
    
    // 监听连接状态
    realm.syncSession.addConnectionChangeListener { _, newState ->
        println("__print::同步连接状态: $newState")
    }
    // 监听上传进度
    realm.syncSession.addProgressListener(ProgressDirection.UPLOAD, ProgressMode.REPORT_INDEFINITELY) {
        println("__print::上传进度: ${it.transferredBytes}/${it.totalBytes}")
    }
    // 监听下载进度
    realm.syncSession.addProgressListener(ProgressDirection.DOWNLOAD, ProgressMode.REPORT_INDEFINITELY) {
        println("__print::下载进度: ${it.transferredBytes}/${it.totalBytes}")
    }
    
    realm.addChangeListener { updateUi() }
}

5. 确认数据字段与服务器规则匹配

你的代码中已设置item.ownerId = user.id,需确保服务器规则中的字段名是owner_id(与Item类中@RealmField("owner_id")标注一致),否则服务器会过滤掉不符合规则的数据,导致无法同步。


内容的提问来源于stack exchange,提问作者francis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 13:20:51