2014-02-17 59 views
0

考虑两个核心数据实体:文档类别。一个文档可以有很多categories,而一个类别可以有很多documents(反比关系)。此外,如果文档已被打开,则文档具有布尔属性opened,即YES与标准有效地计算关系

使用核心数据,计算给定类别的打开文档的最有效方法是什么?

或者是Core Data足够聪明地使用反向关系来优化这个获取请求?

NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"Document"]; 
fetchRequest.predicate = [NSPredicate 
    predicateWithFormat:@"opened == YES AND ANY categories.name == %@", 
    categoryName]; 
NSError *error = nil; 
NSUInteger count = [context countForFetchRequest:fetchRequest error:&error]; 

编辑

显然,这是。生成的SQL用于上述提取:

SELECT COUNT(DISTINCT t0.Z_PK) 
FROM ZDOCUMENT t0 
JOIN Z_3CATEGORIES t1 ON t0.Z_PK = t1.Z_3DOCUMENTS 
JOIN ZCATEGORY t2 ON t1.Z_4CATEGORIES = t2.Z_PK 
WHERE (t0.ZCD_OPENED = ? AND t2.ZNAME = ?) 

回答

0

您的代码非常好。我认为这是在Core Data中执行此操作的最有效方式。

我想@"opened == YES"将工作,
@"opened == 1"@"opened == OK %@", @YES将某些工作。

(而且,如果你喜欢简洁,你可以用=替代==。)

+0

感谢芒迪。你知道这种行为是否记录在某个地方?毕竟,Core Data在幕后做的事情并不明显。 – hpique

+0

原来,获取类别和迭代它的笔记比我的问题中的单个获取快得多。如果我能,我会隔离代码并发布仪器比较。 – hpique

+0

我不相信遍历结果比'countForFetchRequest'快。也许你正在迭代一些类别名称列表并反复调用获取 - 这可能会很昂贵。但那会是另一个问题。 – Mundi