2010-10-21 4 views
2

J'ai la relation suivante définie dans les données fondamentales/Suppression de relations à l'aide des données de base

Personne -> A travaillé < - emploi

J'ai une vue qui affiche des informations dans une personne tableview. L'utilisateur peut alors cliquer sur Éléments travaillés pour voir tous les éléments travaillés pour cette personne (l'entité travaillée montre les heures travaillées et le travail associé). Je pousse ensuite une vue montrant les emplois travaillés pour cette personne. Je montre également, dans une vue sélecteur, une liste des travaux qui peuvent être ajoutés à la liste Travaillé.

J'ai essayé de faire cela de toutes les façons possibles, mais je ne suis pas sûr d'aller dans la bonne direction, alors j'aimerais avoir l'avis des experts à ce sujet. Que dois-je passer dans la vue Travaillé?

Je passe actuellement dans l'objet Person contenant le NSSet travaillé pour charger la vue tabulaire. Ensuite, j'utilise un NSFetchedResultsController pour charger le sélecteur. J'ai donc obtenu la fonctionnalité d'ajout en utilisant les méthodes addWorkedObject: Person et Job. Mais je dois laisser l'utilisateur supprimer un élément travaillé de la vue de la table.

Dois-je utiliser deux NSFetchedResults? Si c'est le cas, comment? Je suis vraiment à bout de nerf avec celui-ci, donc si quelqu'un peut aider, je l'apprécierais vraiment.

Merci,

Rod

Répondre

0

je aurais besoin d'un peu plus d'informations. Premièrement, vos relations sont-elles unidirectionnelles comme le suggère votre diagramme? D'après ce que j'ai lu, Core Data est beaucoup plus heureux avec les relations bidirectionnelles.

Par exemple, ce modèle (ci-dessous)

Personne < - >> Travaillé < < -> Job

stipule qu'une personne peut 'avoir' beaucoup d'objets travaillés, alors que un objet travaillé sera associé à au plus une personne. De même, un Job peut être associé à de nombreux objets Worked mais un objet Worked ne sera jamais associé qu'à au moins un Job. Est-ce votre modèle?

Si c'est le cas, j'utiliserais un NSFetchedResultsController pour la vue racine (celle qui montre toutes les personnes). Mais j'utiliserais simplement NSSets/NSArrays pour remplir UITableView et UIPickerView.

Ceci est une méthode que j'utilise pour le débogage - mais elle pourrait fournir un point de départ pour obtenir tous les Jobs, par exemple. Pour vos besoins, vous pouvez remplir un tableau NSARray avec les NSManagedObjecs dans 'items'.

- (void) dumpAllObjects:(NSString *) entityDescription 
{ 
DLog(@"Dump all object of type '%@']", entityDescription); 
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
[fetchRequest setEntity:[NSEntityDescription entityForName:entityDescription 
         inManagedObjectContext:managedObjectContext]]; 

NSError *error = nil; 
NSArray *items = [managedObjectContext executeFetchRequest:fetchRequest error:&error]; 
[fetchRequest release]; 

DLog(@" There are %d instances of entity '%@'", [items count], entityDescription); 

for (NSManagedObject *managedObject in items) 
    { 
    if ([managedObject respondsToSelector:@selector(dump)]) 
     [managedObject dump]; 
    } 
} 

Pendant ce temps, je sous-classe UIViewController pour votre point de vue qui montre des objets et des objets Travaillé Job - et ont cette classe implémente UITableViewDelegate, UITableViewDataSource, UIPickerViewDelegate et UIPickerViewDataSource. En ce qui concerne la suppression, je ne suis pas sûr de l'aspect qui cause des problèmes. Si vous avez -addWorkedObject: méthodes pour Person et Job, alors vous devriez aussi avoir -reomveWorkedObject: methods. Non?

Espérons que cela aide.

+0

Merci, westsider. Mes relations sont bidirectionnelles, comme vous l'avez dit. J'appelais removeObject des objets parents (Person, Job), mais l'objet relation était toujours là, mais sans les objets référencés (en fait un enregistrement fantôme dans la base de données). – Rod

+0

J'ai ignoré la méthode delete du contexte de l'objet (Core Data est nouveau pour moi). J'ai été capable de faire ce que vous avez dit, en utilisant un controleur récupéré pour les données du sélecteur et en chargeant les données de la table du NSSet. J'ai ensuite appelé la suppression du contexte de l'objet Worked dans la ligne sélectionnée et voila, tout fonctionne comme un charme maintenant. Merci beaucoup! – Rod

Questions connexes