2012-06-28 47 views
0

在我的應用程序中,我使用coredata來存儲一大組聯繫人。我需要知道所有的名字與他們的迴應計數。例如,如果數據集包含六個人:比爾蓋茨,比爾約旦,比爾克林頓,邁克喬丹,邁克喬布斯,湯姆克林頓。 我需要得到的結果:以計數2計數3比爾,邁克,湯姆計數1在coredata中使用setPropertiesToFetch時,如何獲得每個結果的計數?

如果我試試這個:

[fetchRequest setPropertiesToFetch:[NSArray arrayWithObject:@"firstName"]; 
[fetchRequest setResultType:NSDictionaryResultType]; 

[managedObjectContext executeFetchRequest:fetchRequest error:nil]; 

那麼我只能拿到3字典中的價值名字。但我無法得到伯爵。 如果我使用默認的結果類型,我會得到六個管理對象。迭代循環來獲取名字並計算它的數量需要額外的時間成本。

所以我的問題是,如何儘可能快地獲取特定屬性的值和它的數量? 非常感謝。

順便說一下,我也嘗試使用NSFetchResultController與keyNamePath,並嘗試獲取該部分的信息。但有很多路段時速度非常慢。它比我獲得所有已分類的managedObject並且自己計算屬性更慢。

回答

0

你是什麼意思一大批聯繫人?根據規模,問題絕對不一樣。

無論如何,使用數據庫功能很好地處理問題可能是值得的。

Person 
- firstName -> FirstName 
- lastName -> LastName 

FirstName 
- name: string 
- persons ->> Person 

LastName 
- name: string 
- persons ->> Person 

從這些實體(表)開始,知道有多少人共享多少個名稱會容易得多。不過,這肯定是數據庫請求了相當多的,所以它可能大大有助於增加一個櫃檯,同樣:

FirstName 
- name: string 
- persons ->> Person 
- personCount: integer 

LastName 
- name: string 
- persons ->> Person 
- personCount: integer 

當然,你必須保持同步計數器,但那麼這將是非常容易獲取您想要的數據,無論條目數量多少。

(它甚至可以使用比簡單表更少的磁盤空間。)

+0

非常感謝,添加新表格和關係將有所幫助。但是,如果有很多我想獲得和計算的屬性,我應該保留許多額外的表格。因此,如果coredata的fetchquest提供了一個API來獲取屬性的數量,我認爲解決方案會更好。 至於larget數據集,我測試了在iPhone4中,我有5000個managedObject和94個姓氏節,使用NSFetchedResultController需要7.7秒。但是,如果不使用分區,只需要0.4秒。 – beof

+0

如果我遍歷已排序的managedObject並將數據截面爲我自己,則需要3.1秒。但是我認爲如果coredata可以通過它的數量直接獲取屬性,3.1秒就可以減少。 – beof

相關問題