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"];