コアデータを使用するのはこれが初めてで、次のエラーが発生します。
修正方法を教えていただければ幸いです。
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
理由は次のとおりです。
ストアを開くために使用されたモデルは、ストアを作成するために使用されたモデルと互換性がありません
そして、これがあなたがそれをした方法です:
これは、新しい管理対象オブジェクトモデルが古いバージョンのストレージ(アプリを起動したときに初めて作成されたもの)を使用しようとしているためです。
迅速で汚い修正は、ストレージファイル(〜/ Library/Application Support/YOUR_APP /のどこかにあります)を削除して、アプリを再起動することです。
将来の参考のために(アプリをリリースし、次のリリースでアプリが管理対象オブジェクトモデルを変更した場合)、そのアプリの移行を作成する必要があります。これ以上のことは、Appleドキュメントのコアデータプログラミングクックブックでカバーされています。
シミュレーター/デバイスからアプリを削除すれば十分です。
プロジェクト内のファイルを変更する必要はありません(現在のモデルを選択し、メニューを使用してクラスを置き換える場合を除きます:エディター/ NSManagedオブジェクトサブクラスの作成)。
次の手順を実行する必要があります
開発モードで、エンティティを変更するたびにアプリを削除したくない場合は、次のソリューションを使用することをお勧めします。
- (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
を独自のパスに変更することを忘れないでください。
それは私にも起こり、STORE URLを削除することで、次のコードでこれを修正しました-[[NSFileManager defaultManager] removeItemAtURL:storeURL error:nil]
明確化:テスト間でデータを保持したくない場合は、storeURLにあるファイルを削除して再作成します。新しいテストには新しいモデルバージョンがあり、古いファイルを正しく開くことができなかったためです。また、管理対象オブジェクトモデルを変更した場合は、そのモデルの移行を作成する必要があります。
別のアプリケーションによって作成されたストアからデータをロードする必要がある場合があります。 1つのアプリは、外部ソースからデータをロードしてストアに保存するためだけに使用され、他のアプリは、データでいっぱいのこのストアを開始点として使用します。
非常に正しいとは言いたくありませんが、アプリの開発中に時々必要になった場合は、ストア内のUUIDを(SQLVueなどによって)アプリで期待される正しいものに変更するだけです。 。ほとんどの場合、ZMETADATAと呼ばれるテーブルのUUIDは、Z_UUIDと呼ばれる唯一の列にあります。ただし、覚えておいてください-迅速なデバッグ/開発の目的のためだけです。これをプログラムで使用しないでください。