【问题标题】:How to use NSPredicate for whether a List of Int contains a Int number?如何使用 NSPredicate 判断 Int 列表是否包含 Int 数?
【发布时间】:2019-08-16 03:23:07
【问题描述】:

我有一个 Realm 模型Person,他有一个 tag 属性。

let tags = List<Int>()

现在,我想执行这样的搜索

realm.objects(Person.self).filter(NSPredicate(format: "\(tagID) IN tags"))
// "0 IN tags"

错误:

Terminating app due to uncaught exception 'Invalid value', reason:
 'Expected object of type (null) for property 'tags' on object of type
 'Person', but received: 0'

【问题讨论】:

  • 不支持查询原语列表。见this问答。

标签: swift realm nspredicate


【解决方案1】:

正如 David 的评论中所述,您不能对原语列表进行过滤。

编辑: 10.7 版增加了对过滤器/查询以及基元聚合函数的支持,因此以下信息不再完全有效。但是,这仍然需要注意。

您只能过滤包含领域对象的列表。但是,还有其他解决方案。

这里我们获取所有的 Realm 对象并使用 Swift 过滤这些对象。在这种情况下,我们想要所有标签 = 7 的人。

let personResults = realm.objects(PersonClass.self)
let persons = personResults.filter { $0.tags.firstIndex(of: 7) != nil }
    
for person in persons {
    print(person.name)
}

对于另一种选择,请参阅@DávidPásztor 评论中链接中的答案。

【讨论】:

  • 我知道这个方法,但是它会立即将所有数据加载到内存中,对吧?因此,或者,我可以创建一个标签模型来存储所有标签,然后我可以过滤列表包含特定标签,因为标签现在是 Object 的子类。
  • @JsW 嗯,是的,有点。领域对象是延迟加载的,因此在访问它们之前它们实际上不会存在或保留在内存中。但它可能相关,也可能不相关。例如;如果您有几百个用户,或者可以使用过滤器限制您的结果,那将是低内存影响。正如链接中所建议的那样,替代方法是创建一个 Tag 对象。然而,这样做的缺点是你有另一个 Realm 正在管理的对象,最终可能会有 500 个值为 2 的 Tag 对象,所有这些乱七八糟的东西都将存储在 Realm 中。
  • 是的,这正是我的想法。我需要做出取舍。因为我到处都在使用 Reasults 作为数据源类型,所以让它们兼容会很麻烦。谢谢,伙计。
猜你喜欢
  • 2023-02-20
  • 1970-01-01
  • 1970-01-01
  • 2014-03-25
  • 2011-05-10
  • 1970-01-01
  • 2012-08-14
  • 2011-03-01
  • 2018-08-10
相关资源
最近更新 更多