countForFetchRequest和executeFetchRequest返回不同数量的结果

时间:2010-10-26 18:06:21

标签: iphone core-data nspredicate

我发现NSFetchRequest正在为计数和执行返回不同的结果。

我有一个Product实体和一个Size实体。产品有很多尺寸。

我有两个产品,productA和productB。 ProductA仅适用于size1,productB适用于size1和size2。

鉴于NSPredicate

'ANY sizes.#size IN {"size1", "size2"}'

我发现它为countForfetchRequest返回3,但在执行获取请求时返回2个数组的数组。

计数是不正确的值。 ProductB有两种尺寸,似乎在countForfetchRequest中被计算两次,但显然只能通过executeFetchRequest调用返回一次。

我尝试设置setReturnsDistinctResults:YES没有效果。

2 个答案:

答案 0 :(得分:1)

我在答案中略微修改了谓词。请注意,关于您可能遇到的解析问题(在我之前的评论中给出)的相同注意事项仍然适用。我假设您有多个大小,比如sizeA,sizeB,sizeC等。您需要一个子查询来正确处理Core Data中的多对多关系,如下面的谓词所示

编辑:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(sizes.@count == 1 || sizes.@count == 2) && (1 == SUBQUERY(sizes, $sub, $sub.#size == %@ || $sub.#size == %@).@count  || 2 == SUBQUERY(sizes, $sub, $sub.#size == %@ || $sub.#size == %@).@count)", yourSizeAvariable, yourSizeBvariable];

请告诉我这是否适合您。

答案 1 :(得分:0)

我认为当你进行计数时,它会计算从sql查询返回的行数。当您查询大小表时,您将返回3,因为等效的sql将返回3行。

当你进行提取时,你得到2,因为你只会得到两个产品对象。但是,如果你在这些产品中查看大小对象的数量,你会发现3。

哦,并且select distinct不起作用,因为你有3组独特的值: - )