web-dev-qa-db-fra.com

Comment mettre à jour un objet existant dans Core Data?

Quand j'insère un nouvel objet, je le fais avec le code suivant:

NSManagedObjectContext *context = [appDelegate managedObjectContext];

Favorits *favorits = [NSEntityDescription insertNewObjectForEntityForName:@"Favorits" inManagedObjectContext:context];

favorits.title = @"Some title";

NSError *error;                    
if (![context save:&error]) {
    NSLog(@"Whoops");
}

Comment puis-je mettre à jour un objet existant dans les données de base?

56
iWizard

La mise à jour est simple, il suffit de créer un nouveau.

Pour mettre à jour un objet spécifique, vous devez configurer une NSFetchRequest. Cette classe est équivalente à un état SELECT en langage SQL.

Voici un exemple simple:

NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:[NSEntityDescription entityForName:@"Favorits" inManagedObjectContext:moc]];

NSError *error = nil;
NSArray *results = [moc executeFetchRequest:request error:&error];

// error handling code

Le tableau results contient tous les objets gérés contenus dans le fichier sqlite. Si vous voulez récupérer un objet spécifique (ou plusieurs objets), vous devez utiliser un prédicat avec cette requête. Par exemple:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"title == %@", @"Some Title"];
[request setPredicate:predicate]; 

Dans ce cas, results contient les objets où title est égal à Some Title. Définir un prédicat est égal à mettre la clause WHERE dans une instruction SQL.

Pour plus d'informations, je vous suggère de lire le guide de programmation Core Data et la référence de la classe NSFecthRequest.

J'espère que ça aide.

EDIT (extrait pouvant être utilisé pour la mise à jour)

// maybe some check before, to be sure results is not empty
Favorits* favoritsGrabbed = [results objectAtIndex:0];    
favoritsGrabbed.title = @"My Title";

// save here the context

ou si vous n'utilisez pas une sous-classe NSManagedObject.

// maybe some check before, to be sure results is not empty
NSManagedObject* favoritsGrabbed = [results objectAtIndex:0];
[favoritsGrabbed setValue:@"My title" forKey:@"title"];

// save here the context

Dans les deux cas, si vous faites une save sur le contexte, les données seront mises à jour.

127
Lorenzo B

Vous devez extraire l’objet du contexte, modifier les propriétés souhaitées, puis enregistrer le contexte tel que vous l’êtes dans votre exemple.

11
shawnwall

J'espère que cela vous aidera. comme cela fonctionne pour moi.

 NSMutableArray *results = [[NSMutableArray alloc]init];
int flag=0;
NSPredicate *pred;
if (self.txtCourseNo.text.length > 0) {
    pred =  [NSPredicate predicateWithFormat:@"courseno CONTAINS[cd] %@", self.txtCourseNo.text];
    flag=1;
} else {
    flag=0;
    NSLog(@"Enter Corect Course number");
}

if (flag == 1) {

    NSLog(@"predicate: %@",pred);
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc]initWithEntityName:@"Course"];
    [fetchRequest setPredicate:pred];
    results = [[self.context executeFetchRequest:fetchRequest error:nil] mutableCopy];


    if (results.count > 0) {
        NSManagedObject* favoritsGrabbed = [results objectAtIndex:0];
        [favoritsGrabbed setValue:self.txtCourseName.text forKey:@"coursename"];
        [self.context save:nil];
        [self showData];
    } else {
        NSLog(@"Enter Corect Course number");
    }



}
7
Patel Jigar

J'ai vu une réponse dans Objective-C qui m'a aidé. Je poste une réponse pour Swift utilisateurs -

        guard let appDelegate = UIApplication.shared.delegate as? AppDelegate
        else 
        {
         return
        }
        let updateCont = appDelegate?.persistentContainer.viewContext
        let pred = NSPredicate(format: "your_Attribute_Name = %@", argumentArray : [your_Arguments])
        let request = NSFetchRequest<NSFetchRequestResult>(entityName: "your_Entity_Name")
        request.predicate = pred

        do {
            let resul = try updateCont?.fetch(request) as? [NSManagedObject]
            let m = resul?.first
            m?.setValue(txtName.text, forKey: "your_Attribute_Name_Whose_Value_Should_Update")
            try? updateCont?.save()

        }catch let err as NSError
        {
            print(err)
        }
0
Ashutosh Shukla

si vous êtes un programmeur Swift, cela peut vous aider:

si vous voulez supprimer un NSManagedObject

dans mon cas, l'ID est un attribut unique pour l'entité STUDENT 

/** for deleting items */

func Delete(identifier: String) {

    let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
    let fetchRequest:NSFetchRequest<NSFetchRequestResult> = NSFetchRequest.init(entityName: "STUDENT")
    let predicate = NSPredicate(format: "ID = '\(identifier)'")
    fetchRequest.predicate = predicate
    do
    {
        let object = try context.fetch(fetchRequest)
        if object.count == 1
        {
            let objectDelete = object.first as! NSManagedObject

                 context.delete(objectDelete)
        }
    }
    catch
    {
        print(error)
    }
} 

si vous souhaitez mettre à jour un NSManagedObject: 

/** for updating items */
func Update(identifier: String,name:String) {

    let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
    let fetchRequest:NSFetchRequest<NSFetchRequestResult> = NSFetchRequest.init(entityName: "STUDENT")
    let predicate = NSPredicate(format: "ID = '\(identifier)'")
    fetchRequest.predicate = predicate
    do
    {
        let object = try context.fetch(fetchRequest)
        if object.count == 1
        {
            let objectUpdate = object.first as! NSManagedObject
            objectUpdate.setValue(name, forKey: "name")
            do{
                try context.save()
            }
            catch
            {
                print(error)
            }
        }
    }
    catch
    {
        print(error)
    }
}
0