64

コア データ ストアを実装するアプリを更新しようとしています。エンティティの 1 つに属性を追加しています。

次のコードをデリゲート クラスに追加しました。

- (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] エラー: エラー

ドメイン=NSCocoaErrorドメイン コード=134130

UserInfo=0x1624d20 "Operation could not be completed. (Cocoa error 134130.)" 2009-12-01 20:04:22.879 Shoppee[25633:207] 未解決のエラー エラー Domain=NSCocoaErrorDomain Code=134130 UserInfo=0x1624d20 "Operation could not be (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-> Editor -> Add Model Version を選択します。

    Xcode 3 の場合: [デザイン] -> [データ モデル] -> [モデル バージョンを追加]。

    .xcdatamodelフォルダに新しいが作成されていることがわかり.xcdatamodeldます (何もない場合も作成されます)

  2. 保存。

  3. 新しいものを選択しLightweight Migrationのドキュメント.xcdatamodelに従って、採用したい変更を行います。

  4. 保存。

  5. 現在/アクティブなスキーマを新しく作成されたスキーマに設定します。

    .xcdatamodeldフォルダが選択されている場合:

    Xcode 4: ユーティリティ サイドバー -> 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 社員は次のことを行う必要があります (Lightweight Migration を既に設定していると仮定します)。

  1. 変更を行う前に、Do Design -> Data Model -> Add Model Version (フォルダーに新しいモデルが作成されていることがわかります).xcdatamodel.xcdatamodeld
  2. 保存
  3. 変更を加える
  4. 保存
  5. アプリを実行

この作業を行うには、ステップ 1 が重要です。これらの手順に従って新しいフィールドを追加したため、この問題に遭遇しました。それはうまくいきました。2 つ目の新しいフィールドを追加しましたが、「モデル バージョンの追加」を忘れてしまい、事態が悪化しました。

于 2010-06-27T20:34:51.327 に答える
11

また、Google社員向け..単純なルール、古い番号付きバージョンを削除/編集しないでください。モデル バージョンを追加すると、番号のサフィックスは 2..3..4 のように増加します。つまり、2 が最も古いもので、次に 3 などです。ただし、編集する現在のものは、番号のないバージョンです。

古いモデル バージョンを使用している以前のデータベースを持つユーザーは、古いスキーマと最新のスキーマを比較しないと最新のデータベース モデルに移行できないため、古いモデル バージョンを削除しないでください。

于 2010-01-18T16:13:11.513 に答える
5

このグーグルに出くわした人へのメモですが、自動(魔法の)移行を使用しても、元のストアのバージョンと新しいストアを作成し、新しいストアを現在のバージョンとして設定する必要があるようです。

于 2009-12-08T03:17:21.503 に答える
1

これまでのところ、エラー メッセージを回避する方法しかわかりません。

しかし、どうすれば修正できますか?

次の解決策で問題は解決しましたが、DBのデータが失われます。

デプロイ/インストールされたアプリケーションの sqlite ファイルを削除/名前変更します。
ファイル名と場所は、エラー メッセージの直後に示されます。例えば:

reason=ソース ストアのモデルが見つかりません}, {
URL = "file://localhost/Users/yourName/Library/Application%20Support/iPhone%20Simulator/4.3/Applications/62F342D4-F007-4F6F-96D2-68F902D3719A/ Documents/Locations.sqlite";

于 2012-08-01T07:53:07.883 に答える
1

軽量移行を行う際に留意すべきこと -

属性の名前変更/変更を計画している場合は、新しいモデルまたは古いモデルのいずれかに「名前変更 ID」の値を設定することを忘れないでください。Apple 独自の例を使用するには、XCode 4.3 で、新しいモデルで paintColor を選択し、Data Model Inspector に切り替え、[バージョン管理] セクションで [名前変更 ID] フィールドを [色] に設定します。私の場合、この手順を実行しないと実行時エラーが発生しました。この同じエラーについては、こちらでも説明しています。新しいユーザーとして、私は画像を投稿することを許可されていないので、ここに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 に答える