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 = ?)
感谢芒迪。你知道这种行为是否记录在某个地方?毕竟,Core Data在幕后做的事情并不明显。 – hpique
原来,获取类别和迭代它的笔记比我的问题中的单个获取快得多。如果我能,我会隔离代码并发布仪器比较。 – hpique
我不相信遍历结果比'countForFetchRequest'快。也许你正在迭代一些类别名称列表并反复调用获取 - 这可能会很昂贵。但那会是另一个问题。 – Mundi