2013-02-01 25 views
2

我正在使用coreData,具有一对多的关系,我有一个文件夹实体和一个文件实体。一个文件夹可以有很多文件等。如何清除/重置一对多关系中的所有CoreData

因此,我有两个ViewControllers,FolderViewController和FileViewController分别包含文件夹和文件。现在我有一个modalView,它可以从文件夹和文件viewcontroller访问。在这个VC中,我有一个按钮来重置所有数据。所以,当我点击这个我想要重置所有的数据。

我使用了这段代码,这个函数是写在appdelegate.m中,并从我的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"); 
} 

所以点击resetButton当我关闭浏览后,我得到这个错误

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

那么如何解决这个问题。

问候 兰吉特

+0

你正在做什么?在CoreData中删除__every__事物? –

+0

我的意思是我想删除所有文件夹和每个文件夹内的所有文件,应用程序应该处于其默认状态。 – Ranjit

+0

你的意思是让应用程序就像刚才安装的一样? –

回答

6

我已经解决了这个问题,以下是代码,

这个功能已经被写入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 
    } 
} 

在我SettingsViewController,我用这种方式点击resetbutton按钮来调用它。

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

Registers Ranjit。

+0

感谢Ranjit - 这对我也有效。 – Cyrus

+0

兰吉特是男人。的工作。 – zumzum

1
NSPersistentStore *store = [self.persistentStoreCoordinator.persistentStores lastObject]; 
    NSError *error; 
    NSURL *storeURL = store.URL; 
    NSPersistentStoreCoordinator *storeCoordinator = self.persistentStoreCoordinator; 
    [storeCoordinator removePersistentStore:store error:&error]; 
    [[NSFileManager defaultManager] removeItemAtPath:storeURL.path error:&error]; 
// Then, just add the persistent store back to ensure it is recreated properly.  
    if (![self.persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) { 
     NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
     abort(); 
    } 
+0

我再次得到相同的上述错误 – Ranjit

+0

你有一个“CoreDataManager”? –

+0

CoreDataManager for? – Ranjit

相关问题