【问题标题】:core data subquery核心数据子查询
【发布时间】:2012-06-15 02:44:29
【问题描述】:

我有一个包含两个可选的多对多关系的实体(childA parent > childB)。这两个子实体中的每一个都包含一个我有兴趣查询的可选字符串。

使用相同的格式,我得到了我期望的结果,但不是另一个。我明白这意味着我不了解我正在使用的工具;并希望有一些见解。这就是这两个查询的样子:

childA.@count != 0 AND (0 == SUBQUERY(childA, $a, $a.string != NIL).@count)
childB.@count != 0 AND (0 == SUBQUERY(childB, $a, $a.string != NIL).@count)

只有当每个实体实例的字符串也为 nil 时,我才希望从 childA 和 childB 的非 nil 实例中获取结果。我的问题是,为什么要给出我期望的结果?而另一个没有?

澄清: 我正在尝试解决我正在寻找两件事之一的一般问题。我要么在属性中搜索默认值。当属性是可选的时,我还在搜索 nil 属性。当仅在填充可选关系时才应考虑可选关系时,问题会更加复杂。如果没有关系计数!= 0,我会以零关系返回所有父母。在一种情况下,这是期望的行为。在另一种情况下,这似乎减少了返回的父计数(结果为 0)。

对于可选属性情况,查询可能如下所示:

parent.@count != 0 AND (parent.gender == -1) OR (parent.gender == NIL)

如果键路径中存在可选关系,则查询采用第一个示例中示例的形式。

再次,我得到了我所期望的结果,除了一个案例,其中似乎没有任何独特的关系或属性特征。或者我应该说,这个异常在数据模型结构或查询格式方面并没有什么独特之处……

【问题讨论】:

  • 要在没有任何附加信息的情况下回答您的最后一个问题,您可能会在第一个查询中偶然得到正确的结果。

标签: ios core-data subquery datamodel


【解决方案1】:

也许你在第二个子句中混淆了==!=,应该是

childA.@count != 0 AND (SUBQUERY(childA, $a, $a.string != NIL).@count != 0)

如果你能先用简单的英语表达查询,你想要达到的目标会更清楚。

顺便说一句,您可以使用NSExpression 类的expressionForSubquery:usingIteratorVariable:predicate: 为您构建子查询。这样您可能会更轻松地获得有用的错误报告。

【讨论】:

  • 感谢您考虑我的问题。请参阅我上面的澄清编辑。
  • 另外,我确定右手子查询是正确的。我已经尝试了 == 和 != 的所有排列。在任何其他情况下,结果显然是不正确的。
【解决方案2】:

我现在明白问题所在了。
就我而言,首先过滤掉计数为 0 的 NSSet 通常是合乎逻辑的。但是,在有问题的情况下,返回计数为 0 的 NSSet 和计数大于 0 的 NSSet 的结果在逻辑上是正确的,其中属性为 nil(当可选时),或者属性设置为其默认值。也就是说,在有问题的情况下,需要去掉left条件,产生如下格式:

(0 == SUBQUERY(childA, $a, $a.string != NIL).@count)

看来我需要让托管对象根据具体情况指示哪种方案是合适的...哎呀!

【讨论】:

    猜你喜欢
    • 2013-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多