问题描述
我正在尝试更新实现核心数据存储的应用程序.我正在向其中一个实体添加一个属性.
I am attempting to update an app that implements a core data store. I am adding an attribute to one of the entities.
我在我的委托类中添加了以下代码:
I added the following code to my delegate class:
- (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;
}
这是来自以下网址:文档
执行代码时出现以下错误:
I get the following error when executing the code:
2009-12-01 20:04:22.877
Shoppee[25633:207] 错误:错误
Shoppee[25633:207] Error: Error
域=NSCocoaErrorDomain 代码=134130
Domain=NSCocoaErrorDomain Code=134130
UserInfo=0x1624d20 "操作无法完成.(可可错误134130.)" 2009-12-01 20:04:22.879 Shoppee [25633:207] 未解决的错误错误域=NSCocoaErrorDomain 代码=134130 用户信息=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 = {项目 = ;商店 = ;};NSStoreModelVersionHashesVersion = 3;NSStoreModelVersionIdentifiers = ();NSStoreType = SQLite;NSStoreUUID = "8DC65301-3BC5-42BE-80B8-E44577B8F8E1";};reason = "找不到源存储模型";}
UserInfo=0x1624d20 "Operation could not be completed. (Cocoa error 134130.)" 2009-12-01 20:04:22.879 Shoppee[25633:207] Unresolved error Error Domain=NSCocoaErrorDomain Code=134130 UserInfo=0x1624d20 "Operation could not be completed. (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 = "Can't find model for source store"; }
看起来我不知何故需要包含原始数据模型,但我不知道该怎么做.有什么建议吗?
It looks like I somehow need to include the original data model but I am not sure how to do that. Any suggestions?
推荐答案
回顾/完整指南:
在进行任何更改之前,创建一个新的模型版本.
Before making any change, create a new model version.
在 Xcode 4 中:选择您的 .xcdatamodel
-> Editor -> Add Model Version.
In Xcode 4: Select your .xcdatamodel
-> Editor -> Add Model Version.
在 Xcode 3 中:设计 -> 数据模型 -> 添加模型版本.
In Xcode 3: Design -> Data Model -> Add Model Version.
您将看到在您的 .xcdatamodeld
文件夹中创建了一个新的 .xcdatamodel
(如果您有无).
You will see that a new .xcdatamodel
is created in your .xcdatamodeld
folder (which is also created if you have none).
保存.
选择您的新 .xcdatamodel
并根据 轻量级迁移文档.
Select your new .xcdatamodel
and make the change you wish to employ in accordance with the Lightweight Migration documentation.
保存.
将当前/活动模式设置为新创建的模式.
Set the current/active schema to the newly created schema.
选择 .xcdatamodeld
文件夹:
With the .xcdatamodeld
folder selected:
在 Xcode 4: Utilities sidebar -> File Inspector -> Versioned Core Data Model -> 选择新模式.
In Xcode 4: Utilities sidebar -> File Inspector -> Versioned Core Data Model -> Select the new schema.
在 Xcode 3 中:设计 > 数据模型 > 设置当前版本.
In Xcode 3: Design > Data Model > Set Current Version.
.xcdatamodel
图标上的绿色勾号将移动到新架构.
The green tick on the .xcdatamodel
icon will move to the new schema.
保存.
实现必要的代码以在运行时执行迁移.
Implement the necessary code to perform migration at runtime.
在您创建 NSPersistentStoreCoordinator
的地方(通常是 AppDelegate 类),对于 options
参数,将 nil
替换为以下代码:
Where your NSPersistentStoreCoordinator
is created (usually AppDelegate class), for the options
parameter, replace nil
with the following code:
[NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
[NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil]
运行您的应用.如果没有崩溃,您可能已经成功迁移:)
Run your app. If there's no crash, you've probably successfully migrated :)
成功迁移后,即可删除迁移代码(第 7 步).(由开发者决定何时可以认为已发布应用的用户已迁移.)
When you have successfully migrated, the migration code (step 7) can be removed. (It is up to the developer to determine when the users of a published app can be deemed to have migrated.)
重要提示:不要删除旧的模型版本/架构.Core Data 需要旧版本迁移到新版本.
IMPORTANT: Do not delete old model versions/schemas. Core Data needs the old version to migrate to the new version.
这篇关于iPhone Core Data“自动轻量级迁移"的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!