【问题标题】:Count items in hierarchy of entities计算实体层次结构中的项目
【发布时间】:2013-02-02 19:10:04
【问题描述】:

我遇到了一个问题,我确实解决了它,但我觉得它效率很低,这涉及遍历父/子引用的核心数据(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 是选择的根类别。

提前致谢。

【问题讨论】:

    标签: ios core-data count hierarchy


    【解决方案1】:

    (用“那是不可能的”来回答是有风险的,但是) 我很确定不存在递归地获取或计数对象的获取请求。您必须使用递归方法或按照您的方式遍历层次结构。

    【讨论】:

    • 能否以某种方式在 SQL 中完成?如果是这样,是否有可能将其移植到获取请求中?
    • 或者也许有另一种范式可以用来查看数据?
    • @dandrejvv:直接访问 SQLite 存储是危险的,因为格式没有正式记录并且可能随时更改。你会遇到缓存问题。 Core Data 是一个对象图管理器,而不是数据库,因此您应该考虑具有关系的对象而不是数据库记录。 - 我不知道如何更有效地解决您的问题。你有几个类别?遍历树真的是性能问题吗?
    • 我不是这个意思。我不想直接访问 SQLite DB。我想知道是否有一种 SQL 查询可以做到这一点的方法,以及是否可以将查询以某种方式移植到获取请求查询。有几个类别。下一个屏幕显示大约需要 2 秒。它现在可以接受,但如果可能的话,我希望它更快一点。
    • @dandrejvv:使用 SQL 可能是可行的(但我不是 SQL 专家),但您不能将任意 SQL 查询移植到 fetch 请求,所以这无济于事。 - 目前我没有更好的主意。
    【解决方案2】:

    如果您只需要计算对象,请使用countForFetchRequest:error:,如下所示:

    NSError *err = nil;
    NSUInteger count = [moc countForFetchRequest:request error:&err];
    if(count == NSNotFound) {
      // Handle error
    }
    

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

    【讨论】:

      猜你喜欢
      • 2021-09-11
      • 2011-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-17
      • 1970-01-01
      相关资源
      最近更新 更多