NSFetchRequest
をコアデータに設定して、エンティティの特定の属性の一意の値を取得しようとしています。つまり.
次の情報を持つエンティティ:
name | rate | factor |
_______|______|________|
John | 3.2 | 4 |
Betty | 5.5 | 7 |
Betty | 2.1 | 2 |
Betty | 3.1 | 2 |
Edward | 4.5 | 5 |
John | 2.3 | 4 |
John、Betty、Edwardだけで配列を返すリクエストをどのように設定しますか?
明確なレコードを取得するには、バッキングストアを使用する必要があります。
John、Betty、Edwardだけで配列を取得したい場合は、次のようにします。
NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"MyEntity"];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"MyEntity" inManagedObjectContext:self.managedObjectContext];
// Required! Unless you set the resultType to NSDictionaryResultType, distinct can't work.
// All objects in the backing store are implicitly distinct, but two dictionaries can be duplicates.
// Since you only want distinct names, only ask for the 'name' property.
fetchRequest.resultType = NSDictionaryResultType;
fetchRequest.propertiesToFetch = [NSArray arrayWithObject:[[entity propertiesByName] objectForKey:@"name"]];
fetchRequest.returnsDistinctResults = YES;
// Now it should yield an NSArray of distinct values in dictionaries.
NSArray *dictionaries = [self.managedObjectContext executeFetchRequest:fetchRequest error:nil];
NSLog (@"names: %@",dictionaries);
APIが意図するオブジェクトグラフマネージャーとしてではなく、手続き型データベースのようにコアデータを使用しようとしているため、これを行う簡単な方法が見つかりません。
Core Dataは値ではなくオブジェクトに関係しているため、Core Dataでこれを行う簡単な方法はありません。管理対象オブジェクトは一意であることが保証されているため、Core Dataは、各オブジェクトの値や、それらが重複しているか他のオブジェクトの値であるかについてはあまり気にしません。
一意の値を見つけるには:
name
と名前文字列自体の値を持つ辞書の配列が得られます。だから、次のようなもの:
NSSet *uniqueNames=[fetchedNameDicts valueForKeyPath:@"@distinctUnionOfSets.name"];
...すべて一意の値を持つNSStringオブジェクトのセットを返します。
特定のプロパティ値の取得 を見てください。個別の値を取得するためにセットを使用する必要はありません。