2013-02-18 41 views
2

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

在此先感谢。

回答

0

(这是有风险的以“那是不可能的”来回答,但)我敢肯定,没有取请求获取或数递归对象。您必须遍历层次结构,无论是递归方法还是您所做的。

+0

它可以在SQL中以某种方式完成吗?如果是这样,是否有可能将其移植到获取请求? – 2013-02-19 06:25:01

+0

或者也许有另一种可以用来查看数据的范例? – 2013-02-19 06:25:31

+0

@dandrejvv:直接访问SQLite存储是危险的,因为格式没有正式记录,并且可能随时更改。你会有缓存问题。核心数据是对象图形管理器,而不是数据库,所以您应该考虑具有关系而不是数据库记录的对象。 - 我不知道如何更有效地解决您的问题。你有几个类别?遍历树真的是一个性能问题吗? – 2013-02-19 08:02:32

1

如果你只需要计算对象,请使用countForFetchRequest:error:类似如下:

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

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