How to update existing object in Core Data?

Objective CCore Data

Objective C Problem Overview


When I insert new object I do with following code:

NSManagedObjectContext *context = [appDelegate managedObjectContext];
                
Favorits *favorits = [NSEntityDescription insertNewObjectForEntityForName:@"Favorits" inManagedObjectContext:context];
                             
favorits.title = @"Some title";
                                            
NSError *error;                    
if (![context save:&error]) {
    NSLog(@"Whoops");
}

How can I update existing object in core data?

Objective C Solutions


Solution 1 - Objective C

Updating is simple as creating a new one.

To update a specific object you need to set up a NSFetchRequest. This class is equivalent to a SELECT statetement in SQL language.

Here a simple example:

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

The array results contains all the managed objects contained within the sqlite file. If you want to grab a specific object (or more objects) you need to use a predicate with that request. For example:

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

In this case results contains the objects where title is equal to Some Title. Setting a predicate is equal to put the WHERE clause in a SQL statement.

For further info I suggest you to read the Core Data programming guide and NSFecthRequest class reference.

Hope it helps.

EDIT (snippet that can be used to update)

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

// save here the context

or if you are not using a NSManagedObject subclass.

// 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

In both cases if you do a save on the context, data will be updated.

Solution 2 - Objective C

You have to fetch the object from the context, change the properties you desire, then save the context as you are in your example.

Solution 3 - Objective C

I hope this will help u. as it works for me.

 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");
    }
    
    
    
}

Solution 4 - Objective C

if you are a swift programmer this can help you :

if you want to delete a NSManagedObject

in my case ID is a unique attribute for entity 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)
    }
} 

if you want to update a 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)
    }
}

Solution 5 - Objective C

I saw an answer in Objective-C which helped me. I am posting an answer for Swift users -

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)
}

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestioniWizardView Question on Stackoverflow
Solution 1 - Objective CLorenzo BView Answer on Stackoverflow
Solution 2 - Objective CshawnwallView Answer on Stackoverflow
Solution 3 - Objective CPatel JigarView Answer on Stackoverflow
Solution 4 - Objective CMohammad Reza KoohkanView Answer on Stackoverflow
Solution 5 - Objective CAshutosh ShuklaView Answer on Stackoverflow