有效地计算与标准的关系

时间:2014-02-17 13:31:44

标签: ios macos sqlite core-data count

考虑两个核心数据实体:文档类别。一个文档可以有很多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 = ?) 

1 个答案:

答案 0 :(得分:0)

您的代码非常好。我认为这是在Core Data中进行此提取的最有效方法。

我猜@"opened == YES"会起作用,
@"opened == 1"@"opened == OK %@", @YES可以肯定。

(如果您想简洁,可以将==替换为=。)