0

当我想过滤我的数据时,我收到错误 *** 由于未捕获的异常“无效的属性名称”而终止应用程序,原因:“在“书”类型的对象中找不到“属性”。我的结构:

class Book: Object, Codable {
@objc dynamic var author = ""
@objc dynamic var title = ""
@objc dynamic var imageLink = ""
@objc dynamic var category = "Lk"
@objc dynamic var date = Date()

convenience init(withBookDict: [String: Any]) {
    self.init()

    self.author = withBookDict["author"] as? String ?? "No Author"
    self.title = withBookDict["title"] as? String ?? "No Title"
    self.imageLink = withBookDict["imageLink"] as? String ?? "No link"
    self.category = withBookDict["category"] as? String ?? "No category"
 }
}

我过滤数据的代码是这样的:

let filteredread = realm.objects(Book.self).filter({ $0.category == "read"})

但我也试过这个:

 let filteredread = realm.objects(Book.self).filter("category == 'read'")

由于存在版本问题,我也确实更新了我的领域 pod。

4

2 回答 2

2

除了“错字”之外,您的代码实际上没有任何问题 - 但还有其他需要考虑的东西。

修正错字

let filteredread = realm.objects(Book.self).filter({ $0.category == "read"})

应该

let filteredread = realm.objects(Book.self).filter { $0.category == "read"}

请注意从过滤器函数(实际上是一个 Swift .filter)中删除 ()。这比任何事情都更清楚,因为在 Realm 对象上使用 swift 函数可能会导致问题。

该查询将首先读取所有 Book 对象,然后对结果执行Swift过滤器并返回 LazyFilterSequence<Results> 对象。这意味着结果与 Realm 断开连接并且不会自动更新,这是 Realm 的关键特性之一。

如果要更新结果,请不要使用 Swift 函数;仅使用领域功能

let filteredread = realm.objects(Book.self).filter("category == 'read'")

它返回一个结果,它将随着基础数据的变化而自动更新。

注意:该函数与您的问题相匹配,并且是完全合法的代码,不会引发任何错误。

于 2021-09-01T17:35:45.347 回答
1

根据字符串属性过滤 Realm 结果的方法是:

 let filteredResult = realm.objects(Model.self).filter("propertyName == %@", "value")

在您的情况下,它将是:

 let filteredread = realm.objects(Book.self).filter("category == %@", "read")
于 2021-09-01T16:40:42.517 回答