64

我正在尝试更新实现核心数据存储的应用程序。我正在向其中一个实体添加一个属性。

我将以下代码添加到我的委托类中:

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {

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

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

    NSError *error = nil;
    persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];

    NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
                             [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
                             [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];

    if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:options error:&error]) {
        NSLog(@"Error: %@",error);
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    }    

    return persistentStoreCoordinator;
}

这来自以下 URL: Doc

执行代码时出现以下错误:

2009-12-01 20:04:22.877

Shoppee[25633:207] 错误:错误

域=NSCocoaErrorDomain 代码=134130

UserInfo = 0x1624d20“操作无法完成。(可可错误134130。)”2009-12-01 20:04:22.879 Shoppee [25633:207]未解决的错误错误域= NSCocoaErrorDomain代码= 134130 UserInfo = 0x1624d20“操作无法完成已完成。(Cocoa 错误 134130。)",{ URL = file://localhost/Users/Eric/Library/Application%20Support/iPhone%20Simulator/User/Applications/A8A8FB73-9AB9-4EB7-8F83-82F5B4467AF1/Documents/MyApp .sqlite; 元数据 = { NSPersistenceFrameworkVersion = 241; NSStoreModelVersionHashes = { 项目 = <869d4b20 088e5c44 5c345006 87d245cd 67ab9bc4 14cadf45 180251e9 f741a98f>; 存储 = <47c250f4 895e6fd1 5033ab42 22d2d493 7819ba75 3c0acffc 2dc54515 8deeed7a>;}; NSStoreModelVersionHashesVersion = 3; NSStoreModelVersionIdentifiers = ( ); NSStoreType = SQLite;NSStoreUUID = "8DC65301-3BC5-42BE-80B8-E44577B8F8E1"; }; reason = "找不到源存储的模型"; }

看起来我需要以某种方式包含原始数据模型,但我不知道该怎么做。有什么建议么?

4

9 回答 9

145

回顾/完整指南:

  1. 在进行任何更改之前,请创建一个新的模型版本。

    在 Xcode 4 中:选择您的.xcdatamodel-> 编辑器 -> 添加模型版本。

    在 Xcode 3 中:设计 -> 数据模型 -> 添加模型版本。

    您将看到.xcdatamodel在您的文件夹中创建了一个新.xcdatamodeld文件夹(如果您没有文件夹,也会创建该文件夹)

  2. 节省。

  3. 根据轻量级迁移文档选择新的.xcdatamodel并进行您希望使用的更改。

  4. 节省。

  5. 将当前/活动模式设置为新创建的模式。

    选择.xcdatamodeld文件夹:

    在 Xcode 4: Utilities sidebar -> File Inspector -> Versioned Core Data Model -> 选择新模式。

    在 Xcode 3 中:设计 > 数据模型 > 设置当前版本。

    图标上的绿色勾号.xcdatamodel将移至新架构。

  6. 节省。

  7. 实现必要的代码以在运行时执行迁移。

    NSPersistentStoreCoordinator的创建位置(通常是 AppDelegate 类),对于options参数,替换nil为以下代码:

    [NSDictionary dictionaryWithObjectsAndKeys:
                      [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, 
                      [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil]
    
  8. 运行您的应用程序。如果没有崩溃,您可能已经成功迁移 :)

  9. 成功迁移后,可以删除迁移代码(第 7 步)。(由开发人员决定何时可以将已发布应用程序的用户视为已迁移。)

重要提示:不要删除旧模型版本/架构。Core Data 需要旧版本迁移到新版本。

于 2011-12-02T23:00:15.427 回答
26

我想到了。

设计 > 数据模型 > 添加模型版本

于 2009-12-02T01:35:48.150 回答
16

再次对 Google 员工来说,这就是您需要做的事情(假设您已经设置了轻量级迁移):

  1. 在进行更改之前,执行设计 -> 数据模型 -> 添加模型版本(您将看到在您的文件夹.xcdatamodel中创建了一个新版本).xcdatamodeld
  2. 节省
  3. 做出改变
  4. 节省
  5. 运行应用

第 1 步对于完成这项工作至关重要。我遇到了这个问题,因为我已经按照这些步骤添加了一个新字段。那行得通。我添加了第二个新字段,但忘记了“添加模型版本”,事情就搞砸了。

于 2010-06-27T20:34:51.327 回答
11

也适用于 googlers.. 简单的规则,永远不要删除/编辑任何旧的编号版本。当您添加模型版本时,数字后缀将增加为 2..3..4,这意味着 2 是下一个最旧的 3,依此类推。但要编辑的当前版本是未编号的版本。

不要删除旧模型版本,因为使用旧模型版本的先前数据库的用户将无法在不比较旧模式和最新模式的情况下迁移到最新的数据库模型。

于 2010-01-18T16:13:11.513 回答
5

对于那些遇到此谷歌搜索的人来说,似乎即使使用自动(魔术)迁移,您仍然需要创建原始商店的一个版本和一个新版本,并将新版本设置为当前版本。

于 2009-12-08T03:17:21.503 回答
1

到目前为止,我只看到如何避免错误消息。

但是我们如何解决它 - 以防我们已经把事情搞砸了?

以下解决方案解决了该问题,但您将丢失数据库中的数据:

删除/重命名已部署/已安装应用程序的 sqlite 文件。
错误消息后直接给出文件名和位置。例如:

原因=找不到源存储的模型},{
URL = "file://localhost/Users/yourName/Library/Application%20Support/iPhone%20Simulator/4.3/Applications/62F342D4-F007-4F6F-96D2-68F902D3719A/文件/位置.sqlite";

于 2012-08-01T07:53:07.883 回答
1

进行轻量级迁移时要记住的一些事情 -

如果您计划重命名/修改属性,请记住在新模型或旧模型中设置“重命名 ID”值。要使用 Apple 自己的示例,在 XCode 4.3 中,在新模型中选择 paintColor > 切换到 Data Model Inspector > 在“Versioning”部分中将“Renaming ID”字段设置为 Color。对我来说,未能执行此步骤会导致运行时错误。此处也涵盖了同样的错误。作为一个新用户,我不能发布图片,所以这里有一个imgur 链接(真的不是垃圾邮件)。

    (Cocoa error 134140.)" UserInfo=0x622b350 {reason=Can't find or automatically infer mapping model for migration
于 2013-02-03T11:16:35.177 回答
0

当更改数据模型并在具有不同版本的 sqlite 文件的已安装应用程序上运行时,您也可能会收到此错误。在这种情况下,只需删除已安装的应用程序并重新运行它。

于 2013-03-21T20:45:05.920 回答
-1

以防万一有人遇到这种情况并且上述方法都不起作用......我正在从模拟器中删除我的应用程序,清理等,但没有任何效果。我必须去模拟器目录并手动 rm .sqlite 文件才能让应用程序再次运行。没有线索...

于 2012-06-18T23:38:18.560 回答