可可核心数据 - 高效相关实体计数

时间:2010-05-10 02:08:20

标签: iphone cocoa core-data entity-relationship

我正在制作我的第一个iPhone应用程序而且我已经碰壁了。我正在尝试为三个实体关系开发一个“统计”页面。我的实体如下:

部门 - 名称,地址,建筑等 人 - 姓名,性别(BOOL),电话等

如果我已获取特定部门,如何过滤这些结果并仅返回男性(性别== 0)的人?

如果我这样做

NSLog(@"%d", [department.people count]);

我得到该部门的正确人数,所以我知道我在附近。我知道我每次都可以重新获取和修改谓词,但我的应用程序中有20多个统计数据似乎效率低下。谢谢你的建议!

2 个答案:

答案 0 :(得分:1)

您无需重新获取:

NSPredicate* pred = [NSPredicate predicateWithFormat:@"gender == NO"];
NSUInteger count = [[department.people filteredArrayUsingPredicate:pred] count];
NSLog(@"%lu", (unsigned long)count);

不知怎的gender==NO看起来仍然很奇怪;)

如果复制过于昂贵,您可以使用枚举器。 E.g:

NSUInteger CountIf(NSEnumerator* en, NSPredicate* pred) {
    NSUInteger count = 0;
    id obj;
    while (obj = [en nextObject]) {
        if([pred evaluateWithObject:obj]) 
            ++count;
    }
    return count;
}

NSUInteger count = CountIf([department.people objectEnumerator], predicate));

...虽然理想情况下会将其移至合适的类别countOfObjectsMatchingPredicate:

答案 1 :(得分:0)

您可以创建代表不同过滤条件的NSPredicate并使用NSSet的{​​{1}}方法。 filteredSetWithPredicate:方法将为您提供与谓词匹配的实体数。这不是非常有效,因为您为每个计算创建了一个新集,但它可能比每次获取要快得多。