2015-09-30 40 views
4

我想知道在多對多關係中獲得相關實體數的最佳方法是什麼。比方說,我有一個看起來像這樣(簡化)的數據模型,我想知道乘客的每個總線數:在數據庫中獲得關係數的有效方法

data model

目前我能想到的兩個選項:

  1. 給公交車實體添加一個額外的屬性,名爲passengerCount,每增加一個乘客就會更新一次。

  2. 每次需要顯示乘客的人數時,都是通過提取乘客並顯示其數量來完成的。

儘管我不知道用核心數據更新/獲取值有多沉重,但我的兩個選項看起來效率很低。例如,想象爲每個表格視圖單元格做數字2。

我的問題是:什麼是最好的方法來做到這一點? NSManagedObject類中的方法可能(我找不到任何)或更有效的其他方式?

+0

您可能想查看'NSFetchRequest'' resultType'屬性的'NSCountResultType'枚舉值。 –

回答

5

最開始有三個備註:

答:在運行有問題時,您應該關心效率。 「不成熟的優化是萬惡之源。」 (Donald Knuth)

B.誰說所有的乘客實體都必須被提取?你認爲這樣的事情...

[bus.passengers count] 

...導致乘客被取走。但是核心數據支持錯誤,所以也許這些實體可能會被誤解。 (只有一個ID,但不是完整的對象。)

C.您可以在開啓詳細模式時看到Core Data的功能。要做到這一點通過啓動參數

-com.apple.CoreData.SQLDebug 1 

你的問題本身:

如果你真的有問題,你可以用-countForFetchRequest:error:索要數顯式。

NSFetchRequest *fetch = [NSFetchRequest fetchRequestWithEntityName:@"passenger"]; 
fetch.predicate = [NSPredicate predicateWithFormat:@"bus == %@", bus]; 
… 
NSUInteger count = [context countForFetchRequest:fetch error:NULL]; // Please pass an NSError instance in real world 

輸入Safari。

0

您的核心數據實體bus的XCode自動生成的NSManagedObject類包含其與Passenger對象的多對多關係的屬性。

您可以將此屬性想像爲實體的「計算屬性」(意思是您不會自己設置屬性,但核心數據會在您添加或刪除關係時自動更新它)。此屬性是NSSet?(參考相關的Passenger對象),NSSet支持.count方法。 因此,您可以使用.count而不需要特殊的提取請求。