MongoDB Stitch与本地DB同步问题:重装App后无法拉取远程数据
解决iOS Swift版MongoDB Stitch重装后远程数据无法同步到本地的问题
我之前碰到过一模一样的情况,核心问题其实是卸载重装后本地是全新的数据库,默认不会自动拉取远程所有数据,再加上你的初始化流程里可能缺了关键的订阅步骤,导致collection.find()只能拿到本地新插入的内容。下面给你一步步排查解决:
第一步:确保登录后再配置同步
同步是和Stitch用户身份绑定的,必须先完成用户认证(不管是匿名登录还是账号密码登录),再去配置集合的同步。如果先配置同步再登录,会导致同步会话无法关联到用户,自然拉取不到远程数据。示例代码:// 先完成用户登录(这里用匿名登录举例,你换成自己的登录方式) app.login(withCredential: AnonymousCredential()) { result in switch result { case .success(let user): // 登录成功后再获取集合并配置同步 let userCollection = app.currentUser!.mongoClient("mongodb-atlas") .database("你的数据库名") .collection("users", withType: M_User.self) // 配置同步,别忘了加上错误监听方便排查问题 userCollection.sync.configure( conflictHandler: DefaultConflictHandler<M_User>.remoteWins(), changeEventDelegate: nil, errorListener: { error in print("同步出错了:\(error.localizedDescription)") if let syncErr = error as? SyncError { print("错误代码:\(syncErr.code)") } } ) // 接下来添加订阅(关键步骤!) self.setupSyncSubscription(for: userCollection) case .failure(let error): print("登录失败:\(error)") } }第二步:添加同步订阅,触发远程数据拉取
MongoDB Stitch的同步是基于订阅查询的——你必须明确告诉SDK要同步哪些数据,它才会把远程符合条件的内容拉到本地。如果要同步整个集合,就订阅一个空的查询:func setupSyncSubscription(for collection: MongoCollection<M_User>) { // 订阅所有用户数据(换成你需要的查询条件) collection.sync.subscribe(to: collection.find(), name: "all-users") { result in switch result { case .success(let subscription): // 监听订阅状态,当状态变为.active时,说明数据同步完成 subscription.observe(\.state) { newState in if newState == .active { print("订阅已激活,远程数据同步完成!") // 这时候再调用find()就能拿到远程同步过来的数据了 collection.find { result in switch result { case .success(let documents): // 处理同步后的文档 print("拿到的同步数据:\(documents)") case .failure(let error): print("查询失败:\(error)") } } } } case .failure(let error): print("订阅失败:\(error)") } } }第三步:检查Atlas控制台的同步权限
去MongoDB Atlas的Realm控制台,检查你这个集合的同步规则是否允许当前用户读取远程数据。比如如果规则设置为只允许用户读取自己创建的数据,那重装后登录的用户只能拉取自己之前插入的内容;如果需要同步所有数据,要确保权限规则允许用户读取整个集合。第四步:避免过早查询数据
不要在配置同步后立刻调用find(),因为同步是异步的,需要等订阅激活、数据拉取完成后再查询。通过上面的subscription.observe监听状态是最稳妥的方式。
按照这几步调整后,重装应用登录后,SDK会自动拉取远程符合订阅条件的数据到本地,这时候查询就能拿到完整的内容了。
内容的提问来源于stack exchange,提问作者Amit Shetye
相关产品推荐
相关产品推荐

