【问题标题】:Swift Realm - "Value of type 'Results' has no member"Swift Realm - “'Results' 类型的值没有成员”
【发布时间】:2020-02-03 18:33:24
【问题描述】:

我正在尝试从 RealmDB 获取数据并按 id 过滤。正如领域文档所建议的 (https://realm.io/docs/swift/latest/#queries) 我正在使用:

    let realm = try! Realm()
    let Result = realm.objects(DBName.self).filter("ID == %@", id) 

XCode 在这两行中没有显示任何警告或错误,但是当尝试通过这样做来使用结果时:

    print(Result.ID)

即使在数据库中有 ID 字段 a 也会出现错误: Value of type 'Results<DBName>' has no member 'ID'。而且我也无法访问任何其他字段。

【问题讨论】:

  • 我看到有一个公认的答案,但今后请注意命名,因为它可能会导致混淆。使用此代码realm.objects(DBName.self),DBName 不是 数据库名称,它是一个Object 名称。像 Person 或 Dog 对象。所以这将是更清晰的代码realm.objects(PersonObject.self)

标签: ios swift database xcode realm


【解决方案1】:
realm.objects(DBName.self).filter("ID == %@", id)

这将返回所有DBName 对象,其IDidResults[doc] 中。因此,返回值是一个对象列表。这就是错误显示'Results<DBName>' has no member 'ID' 的原因。

如果您 100% 确定其中有一个对象,则可以尝试以这种方式检索第一个元素。 (对于生产,您应该始终使用 guard 语句来防止崩溃,正如 Jay 在评论部分所建议的那样。)

realm.objects(DBName.self).filter("ID == %@", id).first!

或者,如果您的 ID 是主键,您可以这样做。

realm.object(ofType: DBName.self, forPrimaryKey: id)

【讨论】:

  • @renanlopes 只是一个小点.first! 是危险的,因为它显式地解开一个可选项,它可能为 nil,这可能导致代码崩溃。了解您提到“如果您确定”。 guard let firstResult = realm.objects(DBName.self).filter("ID == %@", id).first { 会是更安全的选择。
猜你喜欢
  • 2016-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-21
  • 2020-09-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多