iPhone Core Data“自动轻量级迁移" [英] iPhone Core Data "Automatic Lightweight Migration"

查看:22
本文介绍了iPhone Core Data“自动轻量级迁移"的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

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

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 = {项目 = <869d4b20 088e5c44 5c345006 87d245cd 67ab9bc4 14cadf45180251e9 f741a98f>;商店 = <47c250f4 895e6fd1 5033ab42 22d2d493 7819ba75 3c0acffc2dc54515 8deeed7a>;};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?

推荐答案

回顾/完整指南:

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

  1. 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“自动轻量级迁移"的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

  • 查看全文
    登录 关闭
    扫码关注1秒登录
    发送“验证码”获取 | 15天全站免登陆