【问题标题】:How to clear/reset all CoreData in one-to-many relationship如何以一对多关系清除/重置所有CoreData
【发布时间】:2013-01-16 18:47:22
【问题描述】:

我正在使用 coreData,具有一对多关系,我有一个文件夹实体和一个文件实体。一个文件夹可以有很多文件等等。

所以,我有两个 ViewController,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'

那么如何解决这个问题。

问候 兰吉特

【问题讨论】:

  • 你想做什么?删除 CoreData 中的每件事
  • 我的意思是我要删除所有文件夹和每个文件夹中的所有文件,并且应用程序应该处于默认状态。
  • 你的意思是让应用像刚刚安装的一样?
  • @xlc0212,你知道怎么解决吗
  • 抱歉暂时没有明确的解决方案

标签: ios ios5 core-data ios6 persistent-storage


【解决方案1】:

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

这个函数已经写在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 中,我在以这种方式单击的重置按钮上调用它。

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

问候 兰吉特。

【讨论】:

    【解决方案2】:
        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();
        }  
    

    【讨论】:

    • 你有一个“CoreDataManager”?
    • 像这样gist.github.com/3967514 管理您的核心数据(创建、删除...)(不删除)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    相关资源
    最近更新 更多