web-dev-qa-db-fra.com

CoreData obtient des valeurs distinctes d'attribut

J'essaie de configurer mon NSFetchRequest sur les données de base pour récupérer les valeurs uniques d'un attribut spécifique dans une entité. c'est à dire.

une entité avec les informations suivantes:

  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   |

Comment configurer la demande de retour d'un tableau avec simplement: John, Betty, Edward?

32
ephilip

Vous devez utiliser le magasin de sauvegarde pour vous aider à obtenir des enregistrements distincts.

Si vous voulez obtenir un tableau avec seulement John, Betty, Edward, voici comment vous le faites:

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

Vous essayez d'utiliser Core Data comme une base de données procédurale au lieu d'un gestionnaire de graphes d'objets comme le prévoyait l'API, vous ne trouverez donc pas de moyen facile de le faire.

Il n'y a pas de façon simple de le faire dans Core Data, car Core Data concerne les objets plutôt que les valeurs. Étant donné que les objets gérés sont garantis d'être uniques, Core Data ne se soucie pas beaucoup des valeurs de chaque objet, qu'il s'agisse de doublons ou de valeurs d'autres objets.

Pour trouver les valeurs uniques:

  1. Effectuez une récupération par valeur spécifique . Cela vous donnera un tableau de dictionnaires avec une clé name et une valeur de la chaîne de nom elle-même.
  2. Sur le tableau retourné dans (1), utilisez un set collection operator pour renvoyer un ensemble de valeurs uniques.

Donc, quelque chose comme:

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

... qui renverra un ensemble d'objets NSString tous avec une valeur unique.

15
TechZen

Jetez un œil à Récupération de valeurs de propriétés spécifiques , il n'est pas nécessaire d'utiliser un ensemble pour obtenir des valeurs distinctes.

5