objective-c - style - img title




Mettre à jour par programme un attribut dans des données de base (4)

J'ai parcouru toute la documentation de classe pour les données de base et je ne peux pas trouver à mettre à jour par programme mettre à jour les valeurs dans une entité de données de base. Par exemple, j'ai une structure similaire à ceci:

 id  | title
============
  1  | Foo  
  2  | Bar  
  3  | FooFoo

Dire que je veux mettre à jour Bar à BarBar, je ne trouve aucun moyen de le faire dans toute la documentation.


La documentation Apple sur l'utilisation d'objets gérés dans Core Data a probablement votre réponse. En bref, vous devriez être capable de faire quelque chose comme ça:

NSError *saveError;
[bookTwo setTitle:@"BarBar"];
if (![managedObjectContext save:&saveError]) {
    NSLog(@"Saving changes to book book two failed: %@", saveError);
} else {
    // The changes to bookTwo have been persisted.
}

(Remarque: bookTwo doit être un objet géré associé à managedObjectContext pour que cet exemple fonctionne.)


On dirait que vous pensez en termes de base de données relationnelle sous-jacente. L'API de Core Data est construite autour d'objets de modèle et non de bases de données relationnelles.

Une entité est un objet Cocoa - une instance de NSManagedObject ou une sous-classe de celle-ci. Les attributs de l'entité sont les propriétés de l'objet. Vous utilisez le codage à valeur-clé ou, si vous implémentez une sous-classe, une syntaxe à point ou des méthodes accesseur pour définir ces propriétés.

La réponse d'Evan DiBiase montre une façon correcte de définir la propriété, spécifiquement un message d'accesseur. Voici la syntaxe de point:

bookTwo.title = @"BarBar";

Et KVC (que vous pouvez utiliser avec un ancien NSManagedObject ):

[bookTwo setValue:@"BarBar" forKey:@"title"];

Dans les données de base, un objet est un objet est un objet - la base de données n'est pas une chose à laquelle vous lancez des commandes.

Pour mettre à jour un élément persistant, vous le recréer en tant qu'objet, le mettre à jour et l'enregistrer.

NSError *error = nil;

//This is your NSManagedObject subclass
Books * aBook = nil;

//Set up to get the thing you want to update
NSFetchRequest * request = [[NSFetchRequest alloc] init];
[request setEntity:[NSEntityDescription entityForName:@"MyLibrary" inManagedObjectContext:context]];
[request setPredicate:[NSPredicate predicateWithFormat:@"Title=%@",@"Bar"]];

//Ask for it
aBook = [[context executeFetchRequest:request error:&error] lastObject];
[request release];

if (error) {
//Handle any errors
}

if (!aBook) {
    //Nothing there to update
}

//Update the object
aBook.Title = @"BarBar";

//Save it
error = nil;
if (![context save:&error]) {
           //Handle any error with the saving of the context
}

NSManagedObject *object = [self.fetchedResultsController objectAtIndexPath:indexPath];

NSManagedObjectContext *context = [self.fetchedResultsController managedObjectContext];

        NSArray *temp = [[NSArray alloc]initWithObjects:@"NewWord", nil];


        [object setValue:[temp objectAtIndex:0] forKey:@"title"];



        // Save the context.
        NSError *error = nil;
        if (![context save:&error]) {
            NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
            abort();
        }

Je pense que ce morceau de code vous donnera l'idée;)





object