我正在尝试更新实现核心数据存储的应用程序.我正在为其中一个实体添加一个属性.
我将以下代码添加到我的委托类:
- (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]错误:错误
Domain = NSCocoaErrorDomain Code = 134130
UserInfo = 0x1624d20"操作无法完成.(可可错误134130.)"2009-12-01 20:04:22.879 Shoppee [25633:207]未解决的错误错误域= NSCocoaErrorDomain代码= 134130 UserInfo = 0x1624d20"操作无法执行已完成.(Cocoa error 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 ="找不到源存储的模型"; }
看起来我需要包含原始数据模型,但我不知道该怎么做.有什么建议?
在进行任何更改之前,请创建新的模型版本.
在Xcode 4中:选择你的.xcdatamodel
- >编辑器 - >添加模型版本.
在Xcode 3中:设计 - >数据模型 - >添加模型版本.
您将看到.xcdatamodel
在您的.xcdatamodeld
文件夹中创建了一个new (如果没有,也会创建一个).
保存.
选择新的.xcdatamodel
,让你想按照聘用变化的轻量级迁移的文档.
保存.
将当前/活动架构设置为新创建的架构.
随着.xcdatamodeld
选择的文件夹:
在Xcode 4:Utilities侧栏 - > File Inspector - > Versioned Core Data Model - >选择新架构.
在Xcode 3中:设计>数据模型>设置当前版本.
.xcdatamodel
图标上的绿色勾号将移至新架构.
保存.
实现必要的代码以在运行时执行迁移.
在NSPersistentStoreCoordinator
创建您的地方(通常是AppDelegate类),对于options
参数,替换nil
为以下代码:
[NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil]
运行你的应用程序 如果没有崩溃,你可能已成功迁移:)
成功迁移后,可以删除迁移代码(步骤7).(由开发人员决定何时可以认为已发布的应用程序的用户已迁移.)
重要信息:不要删除旧的模型版本/模式.核心数据需要旧版本才能迁移到新版本.
我想到了.
设计>数据模型>添加模型版本
对于Google员工,这是您需要做的(假设您已经设置了轻量级迁移):
在进行更改之前,请执行设计 - >数据模型 - >添加模型版本(您将看到.xcdatamodel
在您的.xcdatamodeld
文件夹中创建了一个新的)
保存
做出改变
保存
运行App
第1步对于完成这项工作至关重要.我遇到了这个问题,因为我按照这些步骤添加了一个新字段.那很有效.我添加了第二个新字段,但忘了"添加模型版本",事情爆炸了.
对于googlers ..简单的规则,永远不要删除/编辑任何旧的编号版本.当您添加模型版本时,数字后缀将增加为2..3..4意味着2是最旧的3下一个等等.但是要编辑的当前编号是未编号的版本.
不要删除旧的模型版本,因为使用旧模型版本的先前数据库的用户将无法在不比较旧模式和最新模式的情况下迁移到最新的数据库模型.
对于那些遇到这个谷歌搜索的人来说,似乎即使使用自动(魔术)迁移,您仍然需要创建原始商店的版本和新版本,并将新版本设置为当前版本.