NSPredicate与嵌套数组
我有以下对象结构
分类:
- 子类别(子类别的nsarray)
类别:
- 问题(nsarray的问题)
题:
-
问题(nsstring)
-
答案(nsstring)
我需要的是用给定的子stringsearch任何问题
以下谓词不起作用:
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ANY subcategories.questions.question CONTAINS[cd] %@", substring];
如何正确获取它们?
对于更复杂的谓词string语法,我通常使用predicateWithBlock来评估它们,因为它更容易debugging和理解。 但是,为此,如果您只想获取包含给定子string的所有问题,则可以使用:
NSArray *questions = [self arrayByFlattening:[categories valueForKeyPath:@"subcategories.questions"]]; questions = [questions filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"question CONTAINS[cd] %@", substring]];
其中arrayByFlattening是一种扁平化数组的方法。
如果您需要在一个提取中执行所有操作,也就是说,如果您使用的是大型示例源的核心数据,并且不想获取比您需要的更多,然后过滤结果,则此方法不起作用。
我认为这种极端的嵌套数据是一个非常糟糕的主意。 它过于复杂和容易出错。 很多事情都不直观。 例如,您的谓词将获取所有与您的查询匹配的问题的所有类别。 您仍然可以获取整个类别,包括与查询不匹配的所有问题。 要深入了解,您将不得不再次过滤。
对于这种设置,我非常推荐使用Core Data。 你可以获取必要的问题,因为在核心数据键path工作在两个方向,这就是你需要在这里。
对于您的特定问题,您将获取与谓词匹配的Question
实例
[NSPredicate predicateWithFormat:@"question CONTAINS[cd] %@", substring];
你会得到一个简洁的expression式类似的所有类别的列表
[questions valueForKeyPath:@"subcategory.category"];