2013-02-18 58 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的建議仍然有效。