Eliseo Chavez Jr.
Eliseo Chavez Jr.

Reputation: 854

iPhone - App crashes when trying to save new objects after deleting objects in CoreData

Okay, I'm having a problem saving after I've deleted all the objects I have stored in CoreData. I have no problem with saving if I don't delete anything, but as soon as I ask it to delete all the objects (everything deletes with no errors or problems), and then try saving again, it crashes and just gives me a program received signal: SIGABRT. Here's my code.

- (void)deleteStoredData
{
    // Define our table/entity to use  
    NSEntityDescription *entity = [NSEntityDescription entityForName:MOVIE_LIST inManagedObjectContext:managedObjectContext];

    // Setup the fetch request  
    NSFetchRequest *request = [[NSFetchRequest alloc] init];  
    [request setEntity:entity];

    // Fetch the records and handle an error  
    NSError *error;
    NSUInteger count = [managedObjectContext countForFetchRequest:request error:&error];

    if (count) {
        for (int i = 0; i < count - 1; i++) {
            NSManagedObject *eventToDelete = [self.listOfMovies objectAtIndex:i];
            [managedObjectContext deleteObject:eventToDelete];
        }
    }

    [request release];
}

I thought it might be me comparing self.listOfMovies to the objects stored, so I did a fresh fetch, copied it to a temp NSMutableArray, then replaced self.listOfMovies with temp. But no changes, still crashes. Did I some how delete the entire record and it no longer exists?

What I want to do is load everything onto the app, then delete all the objects in CoreData, so that when the app closes (or terminates) it saves all the new data in the records. Am I doing this correctly, or is there a much easier way to do this? Oh yea, and I only have one entity that holds 5 NSStrings, so nothing to complicated.

Thanks in advance everyone.

Upvotes: 0

Views: 641

Answers (3)

xuzhe
xuzhe

Reputation: 5120

Since you are already have all of managedObject in your array, you do NOT need to do another fetch, just delete them with the code below should be OK.

for (NSUInteger i = 0; i < [self.listOfMovies count] - 1; i++) {
    NSManagedObject *eventToDelete = [self.listOfMovies objectAtIndex:i];
    [managedObjectContext deleteObject:eventToDelete];
}

If it still have problem, would you please tell me how many managedObjectContext do you have in your App? Are you deleting or saving it in a background thread?

In addition, would you please also post the crash log and the information by type "bt -> enter key" in console after your App crashed?

Upvotes: 0

Mundi
Mundi

Reputation: 80271

Possibly, when you call the save method, there might be some mixup with some variable such as the managedObjectContext.

Did you try saving right after the deletion (i.e. in your deleteStoredData method above)?

BTW, I would also go with Christopher's code;-).

Upvotes: 1

Christopher A
Christopher A

Reputation: 2961

Deleting managed objects with a for loop like that is error prone and probably corrupting your managedObjectContext. Try the following:

NSFetchRequest * fetch = [[[NSFetchRequest alloc] init] autorelease];

[fetch setEntity:[NSEntityDescription entityForName:MOVIE_LIST inManagedObjectContext:context]];

NSArray * result = [context executeFetchRequest:fetch error:nil];

for (NSManagedObject * event in result) {
    [context deleteObject:event];
}

Upvotes: 0

Related Questions