模型更改后,擦除存储在CoreData中的所有数据

时间:2009-11-22 11:02:06

标签: iphone objective-c core-data schema persistence

我有一个应用程序,它从互联网上获取数据并使用CoreData将它们存储在设备中,以获得更流畅的体验。

因为我使用Core Data,所以每当我的架构发生变化时,当我尝试使用存储在设备上的先前数据运行它时,应用程序会崩溃。什么是检测此更改并从设备中擦除所有数据的最快方法,因为我不介意重新加载它们。它击败了崩溃并将模式重新映射到新模式(在我的例子中)。

我看到这个检查是在getter中执行的:

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator

所以我只需要知道实现擦除整个数据库并重新设置Core Data的方法。 谢谢:))

1 个答案:

答案 0 :(得分:14)

回到这个问题,要删除我的CoreData存储中的所有数据,我决定简单地删除sqlite数据库文件。所以我就像这样实现了NSPersistentStoreCoordinator

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {

    if (persistentStoreCoordinator != nil) {
        return persistentStoreCoordinator;
    }

    NSURL *storeUrl = [NSURL fileURLWithPath: [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @"myAppName.sqlite"]];

    NSError *error = nil;
    persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
    if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:nil error:&error]) {

        NSLog(@"Error opening the database. Deleting the file and trying again.");

        //delete the sqlite file and try again
        [[NSFileManager defaultManager] removeItemAtPath:storeUrl.path error:nil];
        if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:nil error:&error]) {
            NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
            abort();
        }

        //if the app did not quit, show the alert to inform the users that the data have been deleted
        UIAlertView *alert = [[[UIAlertView alloc] initWithTitle:@"Error encountered while reading the database. Please allow all the data to download again." message:@"" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil] autorelease];
        [alert show];
    }

    return persistentStoreCoordinator;
}