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
- 儿童->儿童(多对多)
- 实体子实体
- TestChildren设置
- Child1
- Child2
- Child3
- Child4
- A1实体
- aB->B1
- aC->C1
- 孩子们
- ->child1
- ->child3
- B1实体
- 孩子们
- ->child2
- 孩子们
- C1实体
- 孩子们
- ->child4
- 孩子们
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秒,这将是一片混乱