为什么在更改实体的属性时会删除我的CoreData信息?

时间:2014-02-22 23:42:19

标签: ios objective-c cocoa-touch core-data

每次我向我的一个CoreData实体添加一个属性并运行应用程序时,我都会得到一个异常,CoreData中的所有内容(我创建的所有对象)都会被删除。

在我的AppDelegate中:

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator
{
    if (_persistentStoreCoordinator == nil) {
        NSURL *storeURL = [NSURL fileURLWithPath:[self dataStorePath]]
        _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:self.managedObjectModel];
        NSError *error;

        if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:@{NSMigratePersistentStoresAutomaticallyOption:@YES, NSInferMappingModelAutomaticallyOption:@YES} error:&error])
        {
            [[NSFileManager defaultManager] removeItemAtURL:storeURL error:nil];
            NSLog(@"Deleted old database %@, %@", error, [error userInfo]);
            [_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:@{NSMigratePersistentStoresAutomaticallyOption:@YES} error:&error];
            abort();
        }
    }
    return _persistentStoreCoordinator;
}

- (NSManagedObjectContext *)managedObjectContext
{
    if (_managedObjectContext == nil) {
        NSPersistentStoreCoordinator *coordinator = self.persistentStoreCoordinator;
        if (coordinator != nil) {
            _managedObjectContext = [[NSManagedObjectContext alloc] init];
            [_managedObjectContext setPersistentStoreCoordinator:coordinator];
        }
    }
    return _managedObjectContext;
}

我得到的错误:

2014-02-23 01:37:08.702 SoundQuiz[8063:70b] Deleted old database Error Domain=NSCocoaErrorDomain Code=134130 "The operation couldn’t be completed. (Cocoa error 134130.)" UserInfo=0xc8796f0 {URL=file:///Users/Eli/Library/Application%20Support/iPhone%20Simulator/7.0.3/Applications/7041F45C-D3B2-4B9D-94A0-F5B68482D065/Documents/DataStore.sqlite, metadata={
    NSPersistenceFrameworkVersion = 479;
    NSStoreModelVersionHashes =     {
        CategoryLevel = <f9824409 52866ec4 6a02251e d7b32d21 430cedd7 2b83ce04 1997e50c 2e0137d6>;
        GameCategory = <d65d9779 80986a4b da767cae b208d733 7944cebf c146e242 e7c9f0ff fc06eb31>;
        LevelSound = <2b23da4d ef82c20d 68a5de45 efb7b2f0 26621867 68904b04 04144acb 44fd43fd>;
    };
    NSStoreModelVersionHashesVersion = 3;
    NSStoreModelVersionIdentifiers =     (
        ""
    );
    NSStoreType = SQLite;
    NSStoreUUID = "A28E8265-2D65-439E-9634-55482C4ED9F0";
    "_NSAutoVacuumLevel" = 2;
}, reason=Can't find model for source store}, {
    URL = "file:///Users/Eli/Library/Application%20Support/iPhone%20Simulator/7.0.3/Applications/7041F45C-D3B2-4B9D-94A0-F5B68482D065/Documents/DataStore.sqlite";
    metadata =     {
        NSPersistenceFrameworkVersion = 479;
        NSStoreModelVersionHashes =         {
            CategoryLevel = <f9824409 52866ec4 6a02251e d7b32d21 430cedd7 2b83ce04 1997e50c 2e0137d6>;
            GameCategory = <d65d9779 80986a4b da767cae b208d733 7944cebf c146e242 e7c9f0ff fc06eb31>;
            LevelSound = <2b23da4d ef82c20d 68a5de45 efb7b2f0 26621867 68904b04 04144acb 44fd43fd>;
        };
        NSStoreModelVersionHashesVersion = 3;
        NSStoreModelVersionIdentifiers =         (
            ""
        );
        NSStoreType = SQLite;
        NSStoreUUID = "A28E8265-2D65-439E-9634-55482C4ED9F0";
        "_NSAutoVacuumLevel" = 2;
    };
    reason = "Can't find model for source store";
}

我似乎无法找到问题所在。在修改实体时,是否始终必须创建新的模型版本?我以为它会自动迁移?

1 个答案:

答案 0 :(得分:2)

如果创建Core Data存储然后编辑Core Data模型而没有首先创建新的模型版本并且未启用自动迁移(模型升级)并再次运行应用程序,则会出现上述错误并且现有存储不会被打开。

首先,您需要在

下面设置persistentStoreCoordinator选项
@{NSMigratePersistentStoresAutomaticallyOption:@YES,
             NSInferMappingModelAutomaticallyOption:@YES}

然后,您需要通过在Xcode中选择现有模型,然后从Xcode中的编辑器菜单中选择添加模型版本来创建新模型版本。现在确保选择新的模型版本,并在Xcode右侧的详细信息面板中将其设置为当前模型(应该有绿色勾号)。

现在您对新模型进行了更改,当您运行应用程序时,它应该升级现有模型。

或者,如果您仍处于开发阶段,并且不关心现有Core Data存储中的内容,只需在再次运行应用程序之前删除它。