NSPredicate与嵌套数组

时间:2014-12-11 21:14:48

标签: ios objective-c nspredicate

我有以下对象结构

分类

  • 子类别(子类别的nsarray)

子类别:

  • 问题(问题的纳粹)

问题:

  • 问题(nsstring)

  • 回答(nsstring)

我需要的是使用给定的子字符串

搜索任何问题

以下谓词不起作用:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ANY subcategories.questions.question CONTAINS[cd] %@", substring];

如何正确获取它们?

2 个答案:

答案 0 :(得分:1)

对于更复杂的谓词字符串语法,我通常使用predicateWithBlock来评估它们,因为它更容易调试和理解。但是,为此,如果你想要做的就是获取包含我将使用的给定子字符串的类别中的所有问题:

NSArray *questions = [self arrayByFlattening:[categories valueForKeyPath:@"subcategories.questions"]];
questions = [questions filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"question CONTAINS[cd] %@", substring]];

其中arrayByFlattening是一种展平数组的方法。

如果您需要在一次获取中执行所有操作,此方法也不起作用,即如果您使用的是具有大型示例源的核心数据,并且不想获取超过您需要的数据,然后过滤结果。

答案 1 :(得分:1)

我认为这种极端嵌套数据是一个非常糟糕的主意。它过于复杂且容易出错。很多事情都不直观。例如,您的谓词将获取所有类别,其中有一些问题与您的查询匹配。您仍然可以返回整个类别,包括与查询不匹配的所有问题。要向下钻取,您必须再次过滤。

对于这种设置,我非常推荐Core Data。您可以获取必要的问题,因为在Core Data中,密钥路径在两个方向上都有效,这就是您需要的。

对于您的特定问题,您将获取与谓词

匹配的Question个实例
[NSPredicate predicateWithFormat:@"question CONTAINS[cd] %@", substring];

您将获得所有类别的列表,其中包含简洁的表达式,如

[questions valueForKeyPath:@"subcategory.category"];