如何在Realm List集合上执行实际计数查询?

时间:2018-03-16 06:36:22

标签: ios swift realm nspredicate

这个特殊用例在Realm docs中缺乏细节,Apple的NSPredicate参考对于不熟悉语法的人来说是一场噩梦。结果,我最终遇到了许多相互关联的问题。

  1. Realm Lists的filter()index()方法有两个变体,一个使用NSPredicate而另一个使用字符串谓词:我是正​​确的从GitHub页面推断出字符串谓词版本只是一个包装器,并且还使用NSPredicate语法?
  2. 如何执行计数查询并实际获取与条件匹配的条目数,而不是与所述条件匹配的Results个对象集合?这甚至可能吗?它甚至是必要的吗?
  3. 使用filter()获取Results个对象集合实际上是否对系统资源征税,或者引用的惰性是否意味着获取Results集合然后检查其.count 1}}相当于一个实际的计数查询(一个SQL)?
  4. 如果filter()不够,我需要在Realm List集合中的特定属性上使用Swift的map()reduce(),该怎么办?这甚至可能吗?
  5. 基本上,我的大多数问题都源于尝试使用存储在领域列表中的对象的属性而不是对象本身,即计算列表中有多少对象具有属性设置为某个值,对于不同的值设置多次,然后确定哪个计数更高 - 从不实际检索任何值以直接使用。

1 个答案:

答案 0 :(得分:1)

  1. 有三种变体:Predicate,String(包装谓词)和一个闭包,你不应该使用它,除非你真的需要它,因为它衰变成一个数组并阻止db查询中的优化它必须将所有结果交给你。

  2. Realm支持NSPredicate聚合函数,包括@count。请参阅documentation

  3. 结果确实很懒,可以优化计数。例如,如果您正在查询索引字段,那么它只能查看索引的数量,而不必拉出所有记录。

  4. 您始终可以使用Array(results)将结果衰减为快速数组。在这种情况下,值会被急切复制,您不再拥有一组懒惰的自动更新结果。然后,您可以使用常规数组或序列执行任何操作,例如filtermapreduceindexfirst等。