Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Core data NSPredicate可检测存在于多个实体关系中的一整套实体_Core Data_Nspredicate - Fatal编程技术网

Core data NSPredicate可检测存在于多个实体关系中的一整套实体

Core data NSPredicate可检测存在于多个实体关系中的一整套实体,core-data,nspredicate,Core Data,Nspredicate,给定这样的核心数据实体设置 实体A aB->B(多对一) aC->C(多对一) 儿童->儿童(多对多) 实体B 儿童->儿童(多对多) 实体C 儿童->儿童(多对多) 实体子实体 我正在尝试执行一个查询来查找所有实体a,以便在所有可访问的子实体中找到一组子实体TestChildren。对于匹配的a实体,A1 TestChildren设置 Child1 Child2 Child3 Child4 A1实体 aB->B1 aC->C1 孩子们 ->child1 ->child

给定这样的核心数据实体设置

  • 实体A
    • aB->B(多对一)
    • aC->C(多对一)
    • 儿童->儿童(多对多)
  • 实体B
    • 儿童->儿童(多对多)
  • 实体C
    • 儿童->儿童(多对多)
  • 实体子实体
我正在尝试执行一个查询来查找所有实体a,以便在所有可访问的子实体中找到一组子实体TestChildren。对于匹配的a实体,A1

  • TestChildren设置

    • Child1
    • Child2
    • Child3
    • Child4
  • A1实体

    • aB->B1
    • aC->C1
    • 孩子们
      • ->child1
      • ->child3
  • B1实体
    • 孩子们
      • ->child2
  • C1实体
    • 孩子们
      • ->child4
因此,在每个班级的各种儿童关系中都发现了所有4个儿童

似乎要测试这些集合,我必须对每个子关系执行子查询,但我认为我无法用NSPredicate格式表达我想要的内容。。也许它根本就不适用于NSPredicates

我的一个想法是这样做

  predicateString += "((SUBQUERY(aB.children, $child, $child in %@).@count + SUBQUERY(aC.children, $child, $child in %@).@count + SUBQUERY(children, $child, $child in $@).@count) == $@)"
  predicateVars.append(contentsOf: [testChildren, testChildren, testChildren, testChildren.count])
其中所有子关系中的匹配计数总数必须匹配。。不幸的是,如果同一个孩子可能出现在多个A、B或C中,那么这是不正确的,因为在两个不同的类中匹配的同一个孩子会导致总数不正确匹配

不管怎样,在NSPredicates中,合计计数似乎是不可能的

要真正做到这一点,唯一的方法是能够生成3个类中所有子类的集合,但同样,似乎没有一种方法可以在NSPredicate中表达这一点

更糟糕的情况是,我可以做一个更简单的查询,并对返回的结果执行更多的逻辑,但理想情况下,我会尝试在查询中尽可能多地执行繁重的工作


提前感谢您找到孩子的所有A:

NSPredicate(format:"aB.children contains %@ OR aC.children contains %@ OR children contains %@", child, child, child)
并谓词查找带有
child1
child2
child3
child4
的所有A:

var predicateArray:[NSPredicate] = []
for child in testChildren {
    let predicate = NSPredicate(format:"aB.children contains %@ OR aC.children contains %@ OR children contains %@", child, child, child)
    predicateArray.append(predicate)
}
let finalPredicate = NSCompoundPredicate(andPredicateWithSubpredicates:predicateArray)

上面Willeke回答的另一个版本是构建谓词,这些谓词被描述为带变量的字符串,如下所示

var predicateString:String = ""
var predicateVars:[Any] = []

for child in testChildren
{
  if (predicateString.count > 0)
  {
    predicateString += " && "
  }

  predicateString += "(aB.children contains %@ || aC.children contains %@ || children contains %@)"
  predicateVars.append(contentsOf: [child, child, child])
}
let predicate = NSPredicate(format: predicateString, argumentArray: predicateVars)

如果所有子关系都是一对多关系,则子关系不能出现在多个a、B或C中。是否要检查测试子关系的所有a是否都是相同的a?还是我误解了这个问题?你是对的,我在描述上犯了一个错误。。我现在已经修改了。道歉。。它的A->B和A->C都是多对1关系,所有的子项都是多对多关系,正如您现在可以在原始问题文本中更清楚地看到的那样。如果有人感兴趣,我在这里添加了另一个关于类似但略有不同的实体层次结构的问题-非常感谢您的建议。明天我会试试,如果我能让它工作,我会接受答案!祝你好运!干杯这很有效。最后我把它作为一个字符串谓词而不是一个复合谓词来重做,我认为它们是等价的,并且字符串更容易在以后调试,因为您可以读取整个谓词。我会把我的版本放在另一个答案中,但我已经接受了你的答案。奇怪的是,为什么我们必须单独处理每个孩子,当我阅读NSPredicate文档时,您应该能够像我尝试的那样处理实体容器。但不管我怎么做,我都无法让它工作,因为它工作得很好!我想知道这些谓词有什么限制。。在字符串形式中,我确实想知道你能把它推多远,类似于复合谓词,幸运的是,我不会期望有超过一小部分的子项以这种方式处理。。这并不是说它将进入10或100秒,这将是一片混乱