【问题标题】:can't open Realm using mongodb sync无法使用 mongodb 同步打开 Realm
【发布时间】:2020-10-25 00:41:34
【问题描述】:

我无法打开领域。我的设置有问题。这是应用程序中的代码:

var configuration = user.configuration(partitionValue: "user=\(user.id)")
configuration.objectTypes = [User.self]
Realm.asyncOpen(configuration: configuration) { [weak self](userRealm, error) in
                self!.setLoading(false);
                guard error == nil else {
                    fatalError("Failed to open realm: \(error!)").   ///// here was my error before the edit (I changed the Permission Settings in Sync)
                }

错误代码:“致命错误:无法打开领域:错误域=io.realm.unknown Code=89“操作已取消”UserInfo={Category=realm.basic_system, NSLocalizedDescription=操作已取消,错误代码=89”

Mongodb Sync 配置截图

编辑: 将 Sync 中的权限设置替换为 Task Tracker 应用程序中提到的设置并使其连接:

编辑:根据 Jay 的建议,配置设置已更改为以下内容。

var configuration = user.configuration(partitionValue: "\(currentUser.id!)")

这是我对用户集合的方案定义:

{
"properties": {
"_id": {
  "bsonType": "string"
},
"_partition": {
  "bsonType": "string"
},
"name": {
  "bsonType": "string"
}
},
"required": [
   "_id",
   "_partition",
   "name"
],
"title": "User"
}

这是我在 Xcode 中的 User 类:

class User: Object {
@objc dynamic var _id: String = ""
@objc dynamic var _partition: String = ""
@objc dynamic var name: String = ""
override static func primaryKey() -> String? {
    return "_id"
}
}

编辑:我通过更新同步权限来建立连接,因此应用程序不再崩溃。但是,现在我收到了这条消息:

Connection to daemon was invalidated
Signup successful!
Log in as user: y
Login succeeded!
2020-10-25...Sync: Connection[1]: Session[1]: client_reset_config = false, Realm exists = false, async open = false, client reset = falseSync: Connection[1]: Session[1]: client_reset_config = false, Realm exists = false, async open = false, client reset = false
2020-10-25...Sync: Connection[1]: Connected to endpoint '13.54.209.90:443' (from '.....:52139')
2020-10-25...Sync: Connection[1]: Reading failed: End of input
2020-10-25...Sync: Connection[1]: Connection closed due to error```

我不明白我上面的代码中的错误“(”无法打开领域:(错误!)“)”没有被触发,但是在日志中它说领域不存在!那么,这里发生了什么?

编辑:这是 mongodb 中的用户表,所以我成功创建了一些用户。

编辑:这是来自 mongodb 的日志

我们可以看到 User Id 和 Request ID 是不一样的!我猜这两个ID应该是相同的字符串才能进行身份验证,对吧??

我正在关注 Swift 的 mongodb 网页上的 Task Tracker 应用程序教程,以将用户登录名添加到我的应用程序中。我在这里错过了什么?

【问题讨论】:

  • Realm asyncopen 显然无法正常工作,但是为什么呢?
  • 我添加了一个答案,但我认为您正在处理两个问题:1)连接到领域,然后 2)使用来自用户对象的自定义配置数据。此外,您似乎使用的是 Realm 的早期版本,因此您应该执行 pod update,注意所有 Realm 函数闭包参数都从 xxxx, error 更改为 Result 对象,因此请准备好更新您的代码。
  • 我从 mongodb 添加了更新的日志,它显示用户 ID 和请求 ID 不一样!我猜这两个ID应该是相同的字符串才能进行身份验证,对吧??
  • 你能在上面的错误日志中解释它的含义吗?“同步:连接[1]:读取失败:输入结束”。读取失败是因为什么?
  • 错误:无法评估同步权限并出现错误:无法与未定义比较 (ProtocolErrorCode=206)。为什么说“与未定义比较”?我在日志中有两个用户 ID 字符串!

标签: swift mongodb realm


【解决方案1】:

作为一个完整的猜测,您的配置字符串不正确

var configuration = user.configuration(partitionValue: "user=\(user.id)")

因为分区值解析为

partitionValue: user=Optional("5f1b586f757611faec257d88")

试试这个

guard let user = your_app.currentUser() else {
    print("no user")
    return
}

guard let userId = user.id else {
    print("no user")
    return
}

var configuration = user.configuration(partitionValue: "user=\(userId)")

更重要的是,您尝试使用的分区值就是这个字符串

user=5f1b586f757611faec257d88

我认为你真正想要的是使用用户 ID

5f1b586f757611faec257d88

这就是我要开始的地方。如果您正在尝试利用 Realm 规则,那么像 _partitionKey: "team_id=1234" 这样的东西会起作用,但这超出了原始问题的范围(并增加了另一层复杂性 - 先让它工作,然后探索规则)。

【讨论】:

  • 将此添加到代码中,配置似乎没问题
  • @kangarooChris 我认为问题是一样的——你告诉领域分区值是这个user= 5f1b586f757611faec257d88,我很确定你想要这个5f1b586f757611faec257d88的分区值(不包括字符串user=)
猜你喜欢
  • 1970-01-01
  • 2018-02-11
  • 1970-01-01
  • 2017-03-25
  • 1970-01-01
  • 2011-04-24
  • 1970-01-01
  • 1970-01-01
  • 2011-10-19
相关资源
最近更新 更多