2010-01-15 19 views
3

J'ai des entités utilisateur et ami dans mon modèle de données, étant une relation d'un utilisateur à plusieurs amis. Mon ViewController, est instancié avec une variable d'instance pour User (* user), et donc je peux accéder à tous les amis en chargeant user.friends comme friends est défini comme NSSet dans mon objet User.Modification des données relationnelles des données de base

Dans mon code, je charge tous les amis dans un NSMutableArray, je fais des choses, et potentiellement avant de partir, je veux ajouter d'autres amis, et éditer les attributs des amis existants. Je ne sais pas comment je peux ajouter/modifier des amis.

Dois-je modifier le NSMutableArray d'objets amis et le sauvegarder dans User.context? Si c'est le cas, comment?

Si vous modifiez un ami, dois-je copier un objet ami existant, modifier des valeurs, supprimer un ancien objet de la matrice et ajouter le nouveau (copié et mis à jour)?

J'espère que cela a du sens ...

Répondre

1

Vous pouvez modifier vos objets amis (pas besoin de faire de nouvelles copies et supprimer les anciens).

Essayez ceci:

// create a mutable copy of an array from the set of the user's friends 
NSMutableArray *friends = [[user.friends allObjects] mutableCopy]; 

// modify friends array or any Friend objects in the array as desired 

// create a new set from the array and store it as the user's new friends 
user.friends = [NSSet setWithArray:friends]; 
[friends release]; 

// save any changes 
NSManagedObjectContext *moc = [user managedObjectContext]; 
if ([moc hasChanges] && ![moc save:&error]) { 
    // handle error 
} 

Vous pouvez également utiliser un ensemble mutable au lieu d'un tableau:

// create a mutable copy of the set of the user's friends 
NSMutableSet *friends = [user.friends mutableCopy]; 

// modify friends set or any Friend objects in the set as desired 

// create a new set from the set and store it as the user's new friends 
user.friends = [NSSet setWithSet:friends]; 
[friends release]; 

// save any changes 
NSManagedObjectContext *moc = [user managedObjectContext]; 
if ([moc hasChanges] && ![moc save:&error]) { 
    // handle error 
} 
+0

Merci - cette approche semble fonctionner. – mootymoots

0

Si vous avez un pointeur/référence à un NSManagedObject vous pouvez modifier tous les attributs. Dites que vous obtenez un ami comme ceci:

Friend *aFriend = [user.friends anyObject]; 
[aFriend setLastName:@"new Lastname"]; 
NSError *error = nil; 
[[self managedObjectContext] save:&error]; 

Pour ajouter un ami faire ceci:

Friend *aNewFriend = [NSEntityDescription insertNewObjectForEntityForName:@"friend" inManagedObjectContext:[self managedObjectContext]]; 
[user addFriendsObject:aNewFriend]; 
NSError *error = nil; 
[[self managedObjectContext] save:&error]; 

Toutefois, ce ne sera pas ajouter le nouvel ami à la NSMutableArray que vous avez créé des user.friends définis précédemment .

+0

Salut, Je n'ai pas NSManagedObject dans mon contrôleur (Je ne Je pense?). J'ai configuré mon contrôleur de vue à partir d'un UITableView comme ceci: Utilisateur * user = (Utilisateur *) [fetchedResultsController objectAtIndexPath: indexPath]; viewController.user = utilisateur; Et dans ce viewController, je reçois des amis comme suit: NSMutableArray * friends = [[NSMutableArray alloc] initWithArray: [utilisateur.friends allObjects]]; Est-ce la mauvaise approche? J'ai copié l'exemple de code Apple pour les recettes iPhone dans Core Data. – mootymoots

+0

ce que je devrais ajouter est qu'avec mon approche je peux obtenir le user.context, ainsi je peux sauver contre cela? – mootymoots

+0

vous pouvez effectuer un suivi complet des modifications lors de l'utilisation NSFetchedResultsController. Tout changement sera signalé à votre contrôleur où vous pourrez l'enregistrer dans le contexte. Consultez la vue d'ensemble dans docs pour plus d'informations - http://developer.apple.com/iphone/library/documentation/CoreData/Reference/NSFetchedResultsController_Class/Reference/Reference.html – Anurag

Questions connexes