2010-01-20 8 views
1

J'essaie de créer une application iPhone Core Data. L'une des entités que je suis suivi est des voitures, et un attribut de chaque voiture est "fabricant".iPhone Core Data - Simple Query

Dans la section «modifier la voiture» de mon application, j'ai un UIPickerView qui doit être chargé avec chacun des fabricants uniques qui ont été précédemment entré dans le système. Ce que j'essaye de faire est de créer un NSFetchRequest pour obtenir un tableau d'attributs "manufacturer" uniques et l'utiliser pour peupler le UIPickerView. Le problème que je rencontre est que s'il y a zéro enregistrements ou 100 dans le magasin de données, il y a toujours un enregistrement dans la requête d'extraction exécutée à l'élément zéro avec une valeur @ "".

Est-ce que je fais cela mal ou est-ce qu'il y a un moyen plus facile de le faire? J'aimerais pouvoir exécuter une requête SQL rapide !!!

Mon code est ci-dessous:

// Populate the manufacturerNameList array 
NSManagedObjectContext *moc = [self.selectedLease managedObjectContext]; 
NSEntityDescription *ed = [NSEntityDescription entityForName:@"Car" inManagedObjectContext:moc]; 
NSFetchRequest *fetchRequest = [[[NSFetchRequest alloc] init] autorelease]; 
[fetchRequest setEntity:ed]; 

// Get only manufacturer and only uniques 
[fetchRequest setResultType:NSDictionaryResultType]; 
[fetchRequest setPropertiesToFetch:[NSArray arrayWithObjects:@"manufacturer",nil]]; 
[fetchRequest setReturnsDistinctResults:YES]; 

// Sort by manufacturer in ascending order 
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"manufacturer" ascending:YES]; 
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil]; 
[fetchRequest setSortDescriptors:sortDescriptors]; 

NSError *error = nil; 
self.manufacturerNameList = [moc executeFetchRequest:fetchRequest error:&error]; 
if (error) { 
    // Handle the error 
} 

NSLog(@"The count of self.propertyNameList is %i",[self.propertyNameList count]); 

Merci!

Répondre

0

L'explication la plus simple est que vous avez une entité de voiture qui a une valeur de fabricant vide. Lorsque le prédicat trie l'extraction, la chaîne vide sera classée en premier.

Je voudrais enregistrer l'ensemble self.propertyNameList et voir ce que vous êtes en train de revenir.

2

manufacturerNameList va être un tableau de Car entités, pas les noms du fabricant. En outre, vous devez transmettre un objet NSArray de NSPropertyDescription à setPropertiesToFetch et pas seulement aux noms d'attribut.

Voici comment vous définissez la propriété:

NSDictionary *entityProperties = [ed propertiesByName]; 
[fetchRequest setPropertiesToFetch:[NSArray arrayWithObjects:[entityProperties objectForKey:@"manufacturer"], nil]]; 

Les résultats de executeFetchRequest: seront un NSArray de Car entités, de sorte que vous devrez ensuite extraire les valeurs d'attributs manufacturer dans une boucle ou quelque chose.

Vous voudrez peut-être envisager de créer une entité Manufacturer que vos références d'entité Car, qui vous permettra d'interroger plus de la façon dont vous essayez maintenant.

+0

Je comprends ce que vous dites complètement, et cela me donnerait sûrement plus de flexibilité sur la route, mais le fait est que Cars est la seule entité dans le domaine, et je m'inquiète de l'ajout d'une autre entité (Manufacturer) à se soucier de rendre le code plus compliqué dans l'ensemble - étant donné que la seule chose que je veux faire avec les constructeurs est de les suivre par rapport à l'entité automobile.Par conséquent, pensez-vous que ce code est le moyen le plus simple d'y parvenir? –

+0

Dans ce cas, je pense que le problème est que vous passez des noms de propriété et non NSPropertyDescriptions à setPropertiesToFetch et que vous traitez ensuite les résultats comme des entités Car, pas comme des chaînes constructeur. –

1

Une autre approche serait de créer une entité pour les fabricants et ont une relation entre la voiture et le fabricant de telle sorte qu'une voiture a un fabricant et un fabricant a beaucoup de voitures:

Car < < -> Fabricant

L'entité Manufacturer peut avoir un attribut de chaîne son "nom". Ensuite, vous pouvez obtenir la liste complète des noms de fabricants en récupérant tous les objets Manufacturer et en regardant la propriété "name".

+0

Le fabricant devrait certainement être sa propre entité avec une relation à la voiture. Si vous l'avez comme une propriété sur l'entité Car, vous limitez votre conception et vous aurez plus de difficultés à garder les fabricants uniques que si vous l'avez comme entité propre. –

Questions connexes