2

がオブジェクトと対多Managerの関係にあるとしEmployeeます。Managerオブジェクト (つまり)への参照が与えられた場合、 「給与が 10000 を超えるすべての人の中で最も給与が低いNSManagedObject *manager」への参照を取得するにはどうすればよいですか?Employee

次の 2 つの方法が考えられます。

アプローチ 1: を構築し、問題のオブジェクト ID を使用して必要なものNSFetchRequestを指定します。ManagerManager

アプローチ 2: でのある種のキー値コーディング式Manager、たとえば[manager valueForKeyPath:@"..."]( NSPredicate? を使用して)

もっともらしい解決策があれば、アプローチ2に傾倒しています。教えてください。

4

2 に答える 2

3

もちろん、関係によって返されるセットに述語とソート記述子を適用することもできます。セットが比較的小さい場合は、簡単で非常に迅速です (メモリ内で行われるため、すべてのオブジェクトをフェッチする必要があります)。I/O の回数を制限するために、前もってバッチ フェッチを実行することをお勧めします。

データベースのサイズとマネージャー (およびインデックス作成) の下の従業員の数に応じて、データベース レベルですべてを実行したい場合があります...

// We want "Employee" objects
NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"Employee"];
// Assuming the "inverse" relationship from employee-to-manager is "manager"...
// We want all employees that have "our" manager, and a salary > 10000
fetchRequest.predicate = [NSPredicate predicateWithFormat:@"(manager == %@) AND (salary > 10000", manager];
// Sort all the matches by salary, little-to-big
fetchRequest.sortDescriptors = [NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"salary" ascending:YES]];
// Limit the returned set to 1 object, which will be the smallest
fetchRequest.fetchLimit = 1;

これにより、データベース レベルでクエリ全体が実行され、1 つのオブジェクトのみが返されます。

いつものように、パフォーマンスの問題は通常、モデルのレイアウト、およびモデルとその関係を指定するために使用されるオプションに大きく依存します。

于 2012-05-22T21:26:48.370 に答える
1

関係の配列をフィルタリングして、Employee必要なものを取得できます。1) まず、Employee給与が 10000 を超えるものをすべて取得します。

NSArray *filtered = [manager.employees filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"(salary > 10000)"]];

2)次に、降順に並べ替えます

NSSortDescriptor* sortOrder = [NSSortDescriptor sortDescriptorWithKey: @"salary" ascending: NO];
NSArray *sortedAndFiltered =  [filtered sortedArrayUsingDescriptors: [NSArray arrayWithObject: sortOrder]];

3)次に、従業員を取得します

[sortedAndFiltered lastObject];
于 2012-05-22T04:53:26.260 に答える