考虑两个核心数据实体:文档和类别。一个文档可以有很多categories
,一个类别可以有很多documents
(反向关系)。此外,Document有一个布尔属性opened
,如果文档已被打开,则为YES
。
使用核心数据,计算给定类别的已打开文档的最有效方法是什么?
或核心数据是否足够智能以使用反向关系来优化此获取请求?
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];
修改:
显然是。为上面的fetch生成的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 :(得分:0)
您的代码非常好。我认为这是在Core Data中进行此提取的最有效方法。
我猜@"opened == YES"
会起作用,
但@"opened == 1"
或@"opened == OK %@", @YES
可以肯定。
(如果您想简洁,可以将==
替换为=
。)