web-dev-qa-db-ja.com

CoreDataは属性の個別の値を取得します

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だけで配列を返すリクエストをどのように設定しますか?

32
ephilip

明確なレコードを取得するには、バッキングストアを使用する必要があります。

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);
71
AlleyGator

APIが意図するオブジェクトグラフマネージャーとしてではなく、手続き型データベースのようにコアデータを使用しようとしているため、これを行う簡単な方法が見つかりません。

Core Dataは値ではなくオブジェクトに関係しているため、Core Dataでこれを行う簡単な方法はありません。管理対象オブジェクトは一意であることが保証されているため、Core Dataは、各オブジェクトの値や、それらが重複しているか他のオブジェクトの値であるかについてはあまり気にしません。

一意の値を見つけるには:

  1. 特定の値でフェッチ を実行します。これにより、キーnameと名前文字列自体の値を持つ辞書の配列が得られます。
  2. (1)で返された配列で 集合コレクション演算子 を使用して、一意の値のセットを返します。

だから、次のようなもの:

NSSet *uniqueNames=[fetchedNameDicts valueForKeyPath:@"@distinctUnionOfSets.name"];

...すべて一意の値を持つNSStringオブジェクトのセットを返します。

15
TechZen

特定のプロパティ値の取得 を見てください。個別の値を取得するためにセットを使用する必要はありません。

5