Search code examples
iosios5core-dataios6persistent-storage

How to clear/reset all CoreData in one-to-many relationship


I am using coreData, with one -to-many realtionship, I have a folder entity and a file entity. A folder can have many files and so on.

So, I have two ViewControllers, FolderViewController and FileViewController which contains folders and files respectively.Now I have a modalView , which is accesible from both folder and file viewcontroller. In this VC I have a button to Reset all Data. So when I click this I want all the data should reset.

I used this code,this function is written in appdelegate.m and called from my VC.

- (void)resetToDefault
{
    NSError * error;
    // retrieve the store URL
    NSURL * storeURL = [[__managedObjectContext persistentStoreCoordinator] URLForPersistentStore:[[[__managedObjectContext persistentStoreCoordinator] persistentStores] lastObject]];
    // lock the current context
    [__managedObjectContext lock];
    [__managedObjectContext reset];//to drop pending changes
    //delete the store from the current managedObjectContext
    if ([[__managedObjectContext persistentStoreCoordinator] removePersistentStore:[[[__managedObjectContext persistentStoreCoordinator] persistentStores] lastObject] error:&error])
    {
        // remove the file containing the data
        [[NSFileManager defaultManager] removeItemAtURL:storeURL error:&error];
        //recreate the store like in the  appDelegate method
        [[__managedObjectContext persistentStoreCoordinator] addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error];//recreates the persistent store
    }
    [__managedObjectContext unlock];
    //that's it !

    NSLog(@"buttonReset Pressed");
}

So after clicking on resetButton when I close the View, I get this error

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Object's persistent store is not reachable from this NSManagedObjectContext's coordinator'

So how to solve this.

Regards Ranjit


Solution

  • I have solved this problem, below is the code,

    This function has been written in appdelegate.m

    - (void) resetApplicationModel
    {
        NSError *error;
        NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"AppName.sqlite"];
        [[NSFileManager defaultManager] removeItemAtURL:storeURL error:nil];
        for (NSManagedObject *ct in [self.managedObjectContext registeredObjects]) {
            [self.managedObjectContext deleteObject:ct];
        }
    
        //Make new persistent store for future saves   
        if (![self.persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) {
            // do something with the error
        }  
    }
    

    And in my SettingsViewController, I am calling this on resetbutton clicked in this way.

    - (void)resetButtonclicked
    {
    AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
            [appDelegate resetApplicationModel];  
    }  
    

    Regards Ranjit.