层级实体中的项数统计

3

我遇到了一个问题,虽然已经解决了,但感觉方法效率不高。问题涉及遍历Core Data(iOS)的实体层次结构,这些实体通过父/子引用链接并附加在特定实体上。

让我更具体地描述一下。我有两种类型的实体:CategoryAttachment

Category 实体通过父/子引用链接。附件作为多对一 (多个附件对应一个分类) 链接到 Categories 上。

如果我想计算给定 Category 层次结构中所涵盖的附件数量,是否可以使用比这更有效的 NSFetchRequest 方法?

NSInteger count = 0;

NSMutableArray *stack = [[NSMutableArray alloc] init];
[stack addObject:targetCategory];

while([stack count] > 0)
{
    Category *current = [stack lastObject];
    [stack removeLastObject];

    count += current.attachments.count;

    for (Category *cat in current.children)
    {
        [stack addObject:cat];
    }
}
targetCategory 是选择的根类别。
提前感谢。
2个回答

2
如果你只需要计算对象的数量,可以使用如下所示的countForFetchRequest:error::
NSError *err = nil;
NSUInteger count = [moc countForFetchRequest:request error:&err];
if(count == NSNotFound) {
  // Handle error
}

显然,@MartinR的建议仍然有效。

0

(回答“不可能”是有风险的,但)我非常确定没有递归获取或计数对象的获取请求。您必须遍历层次结构,可以使用递归方法或像您一样。


能否用 SQL 的方式来完成呢?如果可以的话,是否有将其转换为 fetch 请求的可能性? - Dandré
或许还有另一种范式可以用来看待这些数据? - Dandré
@dandrejvv:直接访问SQLite存储是危险的,因为其格式未经官方文档记录,可能随时更改。您也会遇到缓存问题。Core Data是一个对象图管理器,而不是数据库,因此您应该考虑具有关系的对象,而不是数据库记录。-我没有立即想到如何更有效地解决您的问题。您有多少个类别?遍历树真的是性能问题吗? - Martin R
这不是我想要的。我不想直接访问SQLite数据库。我在想是否有一种方法可以使用SQL查询来实现,并且是否可能以某种方式将查询移植到fetch请求查询中。有几个类别。下一个屏幕出现需要近2秒钟的时间。现在这样做还算可以,但如果可能的话,我希望它能更快一些。 - Dandré
@dandrejvv: 可能使用SQL实现(但我不是SQL专家),但您无法将任意的SQL查询转换为fetch请求,因此这并没有帮助。- 目前我没有更好的想法。 - Martin R
我也尝试了在谓词格式字符串查询中使用SUBQUERY函数,但它只能让我进入1级深度。看起来在谓词格式字符串查询中无法进行多级层次遍历。需要采用不同的方法来获得良好的性能。对于我自己而言,我将保留我的代码。除非有人给出更好的答案,否则我将把这个作为答案标记。 - Dandré

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接