2014-02-17 57 views
0

考慮兩個核心數據實體:文檔類別。一個文檔可以有很多categories,而一個類別可以有很多documents(反比關係)。此外,如果文檔已被打開,則文檔具有布爾屬性opened,即YES與標準有效地計算關係

使用核心數據,計算給定類別的打開文檔的最有效方法是什麼?

或者是Core Data足夠聰明地使用反向關係來優化這個獲取請求?

NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"Document"]; 
fetchRequest.predicate = [NSPredicate 
    predicateWithFormat:@"opened == YES AND ANY categories.name == %@", 
    categoryName]; 
NSError *error = nil; 
NSUInteger count = [context countForFetchRequest:fetchRequest error:&error]; 

編輯

顯然,這是。生成的SQL用於上述提取:

SELECT COUNT(DISTINCT t0.Z_PK) 
FROM ZDOCUMENT t0 
JOIN Z_3CATEGORIES t1 ON t0.Z_PK = t1.Z_3DOCUMENTS 
JOIN ZCATEGORY t2 ON t1.Z_4CATEGORIES = t2.Z_PK 
WHERE (t0.ZCD_OPENED = ? AND t2.ZNAME = ?) 

回答

0

您的代碼非常好。我認爲這是在Core Data中執行此操作的最有效方式。

我想@"opened == YES"將工作,
@"opened == 1"@"opened == OK %@", @YES將某些工作。

(而且,如果你喜歡簡潔,你可以用=替代==。)

+0

感謝芒迪。你知道這種行爲是否記錄在某個地方?畢竟,Core Data在幕後做的事情並不明顯。 – hpique

+0

原來,獲取類別和迭代它的筆記比我的問題中的單個獲取快得多。如果我能,我會隔離代碼併發布儀器比較。 – hpique

+0

我不相信遍歷結果比'countForFetchRequest'快。也許你正在迭代一些類別名稱列表並反覆調用獲取 - 這可能會很昂貴。但那會是另一個問題。 – Mundi