我正在尝试更新实现核心数据存储的应用程序 . 我正在为其中一个实体添加一个属性 .
我将以下代码添加到我的委托类:
- (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;
}
这来自以下网址:Doc
执行代码时出现以下错误:
2009-12-01 20:04:22.877 Shoppee [25633:207]错误:错误域= NSCocoaErrorDomain代码= 134130 UserInfo = 0x1624d20“操作无法完成 . (Cocoa error 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; metadata = {NSPersistenceFrameworkVersion = 241; NSStoreModelVersionHashes = {Item = <869d4b20 088e5c44 5c345006 87d245cd 67ab9bc4 14cadf45 180251e9 f741a98f>; Store = <47c250f4 895e6fd1 5033ab42 22d2d493 7819ba75 3c0acffc 2dc54515 8deeed7a>; }; NSStoreModelVersionHashesVersion = 3; NSStoreModelVersionIdentifiers =(); NSStoreType = SQLite; NSStoreUUID =“8DC65301-3BC5-42BE-80B8-E44577B8F8E1”; }; reason =“找不到源存储的模型”; }
看起来我需要包含原始数据模型,但我不知道该怎么做 . 有什么建议?
9 回答
回顾/完整指南:
在Xcode 4中:选择
.xcdatamodel
- >编辑器 - >添加模型版本 .在Xcode 3中:设计 - >数据模型 - >添加模型版本 .
您将看到 .xcdatamodeld 文件夹中创建了一个新的
.xcdatamodel
(如果没有,也会创建该文件夹) .保存 .
选择新的
.xcdatamodel
并根据the Lightweight Migration documentation进行您希望使用的更改 .保存 .
将当前/活动架构设置为新创建的架构 .
选中 .xcdatamodeld 文件夹:
在Xcode 4:Utilities侧栏 - > File Inspector - > Versioned Core Data Model - >选择新架构 .
在Xcode 3中:设计>数据模型>设置当前版本 .
.xcdatamodel
图标上的绿色勾号将移至新架构 .保存 .
实现必要的代码以在运行时执行迁移 .
在创建
NSPersistentStoreCoordinator
的位置(通常是AppDelegate类),对于options
参数,请使用以下代码替换nil
:运行您的应用 . 如果没有崩溃,你可能已成功迁移:)
成功迁移后,可以删除迁移代码(步骤7) . (由开发人员决定何时可以认为已发布的应用程序的用户已迁移 . )
IMPORTANT: 不要删除旧的模型版本/模式 . 核心数据需要旧版本才能迁移到新版本 .
我想到了 .
设计>数据模型>添加模型版本
对于Google员工,这是您需要做的(假设您已经设置了轻量级迁移):
在进行更改之前,请执行设计 - >数据模型 - >添加模型版本(您将看到在
.xcdatamodeld
文件夹中创建了新的.xcdatamodel
)保存
进行改变
保存
运行应用程序
第1步对于完成这项工作至关重要 . 我遇到了这个问题,因为我按照这些步骤添加了一个新字段 . 那很有效 . 我添加了第二个新字段,但忘了“添加模型版本”,事情爆炸了 .
对于googlers ..简单的规则,永远不要删除/编辑任何旧的编号版本 . 当您添加模型版本时,数字后缀将增加为2..3..4意味着2是最旧的3下一个等等 . 但是要编辑的当前编号是未编号的版本 .
不要删除旧的模型版本,因为使用旧模型版本的先前数据库的用户将无法在不比较旧模式和最新模式的情况下迁移到最新的数据库模型 .
对于那些遇到这个谷歌搜索的人来说,似乎即使使用自动(魔术)迁移,您仍然需要创建原始商店的版本和新版本,并将新版本设置为当前版本 .
到目前为止,我只看到如何避免错误消息 .
但是我们如何解决它 - 以防我们已经搞砸了?
DB中的以下解决方案 fixed the problem but you will loose the data :
已部署/已安装的应用程序的 Delete / rename the sqlite file .
在错误消息之后直接给出文件名称的位置 . 例如 . :
reason =找不到源存储的模型},{
URL = "file://localhost/Users/yourName/Library/Application%20Support/iPhone%20Simulator/4.3/Applications/62F342D4-F007-4F6F-96D2-68F902D3719A/Documents/Locations.sqlite";
进行轻量级迁移时要记住一些事项 -
如果您计划重命名/修改属性,请记住在新模型或旧模型中设置"Renaming ID"值 . 要使用Apple自己的示例,请在XCode 4.3中,在新模型中选择paintColor>切换到数据模型检查器>在"Versioning"部分中将"Renaming ID"字段设置为颜色 . 对我来说,未执行此步骤会导致运行时错误 . 同样的错误也是covered here . 作为一个新用户,我'm not allowed to post images, so here'是一个imgur link(真的不是垃圾邮件) .
在更改数据模型并在具有不同版本的sqlite文件的已安装应用程序上运行时,也会出现此错误 . 在这种情况下,只需删除已安装的应用程序并重新运行它 .
以防万一有人遇到这种情况而上述情况都没有...我正在从模拟器中删除我的应用程序,清理等,但没有任何方法可行 . 我不得不去模拟器目录并手动运行.sqlite文件以使应用程序再次运行 . 没有线索...