2009-11-05 4 views
3

Je souhaite modifier un enregistrement existant dans les données de base. À l'heure actuelle, j'ai ce code, mais il crée un nouveau record (et insère les données correctes dans la bonne colonne):Problème NSManagedObject setValue (Données de base)

NSManagedObjectContext *context = [[NSApp delegate] managedObjectContext]; 
NSManagedObject *instrument = nil; 



instrument = [NSEntityDescription insertNewObjectForEntityForName: @"Instrument" 
        inManagedObjectContext: context]; 

[instrument setValue:[NSNumber numberWithInt:quantityInStockInstruments] 
    forKey: @"quantity"]; 

Le résultat ressemblera à ceci:

Instrument | Value | Quantity 

Violin  | £25 | 9 

      |  | 8 <<< This is the new record that is created, instead of setting the 
          quantity of violin from '9' to '8' 

Je veux le programme pour éditer la colonne quantité de la ligne en surbrillance, (dans ce cas, la ligne 'violon')

+0

La mise à jour de la ligne en surbrillance dépend de la façon dont la table reçoit ses données. Utilisez-vous un ArrayController/bindings ou une source de données? – amrox

+0

Je lie la table à un NSArrayController avec l'entité étant: instrument. L'entité instrument est dans le modèle Core Data. btw, je n'ai pas de fichier .h et .m correspondant à ce NSArrayController. – Michael

Répondre

4

Comme refulgent est dit, l'indice est au nom du sélecteur. Vous ajoutez un nouvel objet.

Une meilleure façon de le faire, plutôt que d'utiliser la table, consiste à utiliser le selectedObjects de votre NSArrayController. A titre d'exemple (ce qui est longue haleine pour plus de clarté et je l'ai écrit sur le dessus de ma tête):

// Get the selected objects from the NSArrayController. 
// There may be more than one object selected, so this needs to be accounted for. 
NSArray *selectedObjectsArray = [yourArrayController selectedObjects]; 

// Get the first object in the array, this is the one that will have it's values changed. 
id firstSelectedObject = [selectedObjectsArray objectAtIndex:0]; 

// Change a value in a KVC compliant way 
[firstSelectedObject setValue:newValue forKey:@"keyValueToChange"]; 

Edité ajouter après le commentaire

Avez-vous une sortie à la contrôleur de réseau et connecté correctement dans Interface Builder?

Quoi qu'il en soit, le code fonctionne pour moi. Voici un example project montrant le fonctionnement.

+0

hmm, j'ai essayé, mais la figure dans la table ne mettra pas à jour, J'ai fondamentalement mis dans ce code, l'ai changé pour adapter mon programme, puis rechargé la table. – Michael

+1

Fonctionne pour moi. J'ai ajouté un lien vers un exemple de projet que vous pouvez télécharger pour voir ce que vous devez faire. – Abizern

+0

Merci beaucoup pour cet exemple de code, ça m'a fait enfin voir ce que je faisais de mal! Merci pour votre aide! – Michael

1

Notez le nom du sélecteur: "insert New Object: inContext".

Comme le dit Amrox, cela dépend de la façon dont votre modèle (c.-à-d. Core Data) et votre contrôleur sont connectés. Il m'est difficile de le dire sans en savoir plus sur votre code, d'autant plus que je suis généralement plus sur le côté iPhone (ce qui n'a pas de bindings), mais en gros vous devez dire [[yourDataArray objectAtIndex: [table selectedRow ]] setValue: @ "quel que soit" forKey: @ "quoi que"]

Questions connexes