web-dev-qa-db-ja.com

コアデータ;ココアエラー134100

コアデータを使用するのはこれが初めてで、次のエラーが発生します。

修正方法を教えていただければ幸いです。

Unresolved error Error Domain=NSCocoaErrorDomain Code=134100 "The operation couldn’t be completed. (Cocoa error 134100.)" UserInfo=0x5927880 {metadata=<CFBasicHash 0x59269a0 [0x1007400]>{type = immutable dict, count = 7,
entries =>
    2 : <CFString 0x5926e10 [0x1007400]>{contents = "NSStoreModelVersionIdentifiers"} = <CFArray 0x5927240 [0x1007400]>{type = immutable, count = 0, values = ()}
    4 : <CFString 0x5927190 [0x1007400]>{contents = "NSPersistenceFrameworkVersion"} = <CFNumber 0x5926ca0 [0x1007400]>{value = +320, type = kCFNumberSInt64Type}
    6 : <CFString 0x59271c0 [0x1007400]>{contents = "NSStoreModelVersionHashes"} = <CFBasicHash 0x5927340 [0x1007400]>{type = immutable dict, count = 2,
entries =>
    0 : <CFString 0x5927280 [0x1007400]>{contents = "Details"} = <CFData 0x59272f0 [0x1007400]>{length = 32, capacity = 32, bytes = 0x434e180241ecf461e59580e640ff926b ... aa456d1410ed9d1b}
    2 : <CFString 0x5927260 [0x1007400]>{contents = "History"} = <CFData 0x59272a0 [0x1007400]>{length = 32, capacity = 32, bytes = 0x3437f77a5563363f66b9d72ea76e0ff1 ... be194eb9dd17cddc}
}

    7 : <CFString 0xe238b0 [0x1007400]>{contents = "NSStoreUUID"} = <CFString 0x5926fc0 [0x1007400]>{contents = "6C5FECCB-0B64-46EB-809B-E0A4577D1E90"}
    8 : <CFString 0xe23720 [0x1007400]>{contents = "NSStoreType"} = <CFString 0xe238f0 [0x1007400]>{contents = "SQLite"}
    9 : <CFString 0x59271f0 [0x1007400]>{contents = "NSStoreModelVersionHashesVersion"} = <CFNumber 0x4d13e20 [0x1007400]>{value = +3, type = kCFNumberSInt32Type}
    10 : <CFString 0x5927220 [0x1007400]>{contents = "_NSAutoVacuumLevel"} = <CFString 0x5927380 [0x1007400]>{contents = "2"}
}
, reason=The model used to open the store is incompatible with the one used to create the store}, {
    metadata =     {
        NSPersistenceFrameworkVersion = 320;
        NSStoreModelVersionHashes =         {
            Details = <434e1802 41ecf461 e59580e6 40ff926b 20004ce9 58eb965f aa456d14 10ed9d1b>;
            History = <3437f77a 5563363f 66b9d72e a76e0ff1 ed7f70fd cb7035e9 be194eb9 dd17cddc>;
        };
        NSStoreModelVersionHashesVersion = 3;
        NSStoreModelVersionIdentifiers =         (
        );
        NSStoreType = SQLite;
        NSStoreUUID = "6C5FECCB-0B64-46EB-809B-E0A4577D1E90";
        "_NSAutoVacuumLevel" = 2;
    };
    reason = "The model used to open the store is incompatible with the one used to create the store";
}
sharedlibrary apply-load-rules all
Current language:  auto; currently objective-c
kill
quit
Program ended with exit code: 0

私のコードはここにあります: https://Gist.github.com/898579

21
max_

理由は次のとおりです。

ストアを開くために使用されたモデルは、ストアを作成するために使用されたモデルと互換性がありません

そして、これがあなたがそれをした方法です:

  1. いくつかの属性を持ついくつかのエンティティを作成し、いくつかのコードを記述しました
  2. アプリを起動し、おそらくいくつかのコンテンツを追加しました
  3. アプリを終了し、属性を持つエンティティをさらにいくつか追加/変更しました
  4. あなたはおそらく再びアプリを起動しました、そして今それはあなたにエラーを与えています

これは、新しい管理対象オブジェクトモデルが古いバージョンのストレージ(アプリを起動したときに初めて作成されたもの)を使用しようとしているためです。

迅速で汚い修正は、ストレージファイル(〜/ Library/Application Support/YOUR_APP /のどこかにあります)を削除して、アプリを再起動することです。

将来の参考のために(アプリをリリースし、次のリリースでアプリが管理対象オブジェクトモデルを変更した場合)、そのアプリの移行を作成する必要があります。これ以上のことは、Appleドキュメントのコアデータプログラミングクックブックでカバーされています。

61
Eimantas

シミュレーター/デバイスからアプリを削除すれば十分です。

プロジェクト内のファイルを変更する必要はありません(現在のモデルを選択し、メニューを使用してクラスを置き換える場合を除きます:エディター/ NSManagedオブジェクトサブクラスの作成)。

14
Wojtek

次の手順を実行する必要があります

  1. それでも同じエラーが表示される場合は、アプリケーションを削除して再実行してください。つまり、特定の属性/異なるタイプの属性を使用したことを意味します。
  2. .xcdatamodeledファイルに移動し、各属性のタイプを確認します。
  3. コードに移動して、コアデータに属性/オブジェクトを挿入しているときに、同じタイプの異なるものを使用したことを確認します。したがって、ポイントはコード内の属性/オブジェクトのtype(NSString、NSDate ...)であり、.xcdatamodeledは同じである必要があります。そうでない場合は、「Error Domain = NSCocoaErrorDomainCode = 134100」というエラーが表示されます。
1
GameBegins

開発モードで、エンティティを変更するたびにアプリを削除したくない場合は、次のソリューションを使用することをお勧めします。

- (void)removeCoreDataStorage {
    // Where does the SQLite file go?
    NSArray *documentDirectories =
    NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
                                        NSUserDomainMask,
                                        YES);
    // Get one and only document directory from that list
    NSString *documentDirectory = [documentDirectories firstObject];
    NSString *path = [documentDirectory stringByAppendingPathComponent:@"model.sqlite"];

    NSError *error = nil;
    NSURL *storeURL = [NSURL fileURLWithPath:path];

    NSURL *storeURLWal = [NSURL URLWithString:[storeURL.absoluteString stringByReplacingOccurrencesOfString:@".sqlite" withString:@".sqlite-wal"]];
    NSURL *storeURLShm = [NSURL URLWithString:[storeURL.absoluteString stringByReplacingOccurrencesOfString:@".sqlite" withString:@".sqlite-shm"]];

    BOOL isRemoveItemAtURL = [[NSFileManager defaultManager] removeItemAtURL:storeURL error:&error];
    if (isRemoveItemAtURL == NO) {
        NSLog(@"NO RemoveItemAtURL. Reason: %@", error.localizedFailureReason);
    }

    BOOL isRemoveItemAtURLWal = [[NSFileManager defaultManager] removeItemAtURL:storeURLWal error:&error];
    if (isRemoveItemAtURLWal == NO) {
        NSLog(@"NO RemoveItemAtURL. Reason: %@", error.localizedFailureReason);
    }

    BOOL isRemoveItemAtURLShm = [[NSFileManager defaultManager] removeItemAtURL:storeURLShm error:&error];
    if (isRemoveItemAtURLShm == NO) {
        NSLog(@"NO RemoveItemAtURL. Reason: %@", error.localizedFailureReason);
    }
}

pathを独自のパスに変更することを忘れないでください。

0

それは私にも起こり、STORE URLを削除することで、次のコードでこれを修正しました-[[NSFileManager defaultManager] removeItemAtURL:storeURL error:nil]

明確化:テスト間でデータを保持したくない場合は、storeURLにあるファイルを削除して再作成します。新しいテストには新しいモデルバージョンがあり、古いファイルを正しく開くことができなかったためです。また、管理対象オブジェクトモデルを変更した場合は、そのモデルの移行を作成する必要があります。

0
Nitin Vatsya

別のアプリケーションによって作成されたストアからデータをロードする必要がある場合があります。 1つのアプリは、外部ソースからデータをロードしてストアに保存するためだけに使用され、他のアプリは、データでいっぱいのこのストアを開始点として使用します。

非常に正しいとは言いたくありませんが、アプリの開発中に時々必要になった場合は、ストア内のUUIDを(SQLVueなどによって)アプリで期待される正しいものに変更するだけです。 。ほとんどの場合、ZMETADATAと呼ばれるテーブルのUUIDは、Z_UUIDと呼ばれる唯一の列にあります。ただし、覚えておいてください-迅速なデバッグ/開発の目的のためだけです。これをプログラムで使用しないでください。

0
Vitek