Mac OS X10.5でCoreDataを使用すると、非常に厄介なエラーが発生します。
すべてのエンティティには、同じ名前を共有するクラスがアプリケーションにあります。
これまで、問題なく5回の移行を実行しました。
XMLデータストアを使用しています。13個のエンティティを持つデータモデルのV5があり、そのうち4個は抽象です。次のようになります。 代替テキストhttp://synapticmishap.co.uk/ObjectModel.jpg
私がやること
データモデルの新しいバージョンを作成します-これはV6です。
新しいエンティティ(JGToolbarWindow)を追加し、親をJGWindowBaseに設定します。
V5からV6に移行するマッピングモデルを追加しました。保存しました。
現在のバージョンをV6に設定します。
ビルドとデバッグ。
PersistentStoreCoordinatorオプションディクショナリで自動移行がオンになっています。
問題
エラーを取得します-「複数の検証エラーが発生しました。」
ブレークポイントを設定し、検証エラーを調べました。検証エラーの長いリストがあります-すべてのデータエントリに1つあるようです。
すべての関係を取り除いているようです。私のプロパティの1つであるapplicationが必須に設定されているため、これは検証エラーとしてカウントされます。
したがって、問題は、移行によって関係を移行できないことにあるようです...関係に関しては、明らかに何も変更されていませんが。
〜/ Library / Application Support / Name of my app /を見ると、同じ名前が.xml.newで追加されたXMLデータストアが表示されます。テキストエディターでこのファイルを見ると、すべての関係が実際に削除されています。アウト。
私が試したこと
新しいXMLデータストアを作成し、そこにいくつかのアイテムを入れてから、再試行します。各アイテムで同じエラーが発生します。
クリーニングと再構築。
以前の検証からの古い.xml.newが削除されていることを確認してください。
新しいモデルバージョンを削除し、アクションを繰り返して、何かを台無しにしないようにします。
デフォルトで無視される各抽象クラスのマッピングエントリを追加します。すべての属性と関係を追加しました。それでもまったく同じエラー。
JGWindowBaseを親として持つNSManagedObjectに基づいて、クラスを持たない新しいエンティティを追加しようとしました。繰り返しますが、失敗しました。
変更されたと思うことができるのは、モデルの基礎となるクラスの内部ロジックの一部だけです。しかし、これらは小さな変更であり、どのようにうまく移行していたのか理解できません。今では、何も変更されていないように見えるときではありません。
名前が変更された最新のデータストアからの新しい移行を試しましたが、まったく同じ問題が発生します。つまり、データ移行を機能させるには、この問題を解決する必要があります。
エラー
下のpresentError行にブレークポイントを設定すると
if (![persistentStoreCoordinator addPersistentStoreWithType:NSXMLStoreType
configuration:nil
URL:url
options:options
error:&error]){
[[NSApplication sharedApplication] presentError:error];
}
エラーuserInfoを調べると、次のようなエラーがたくさん発生します。
Error Domain=NSCocoaErrorDomain Code=1570 UserInfo=0x67ebfd0 "item is a required value."
po (NSArray *)0x67ebfd0
与える:
NSLocalizedDescription = "item is a required value.";
NSValidationErrorKey = item;
NSValidationErrorObject = <NSManagedObject: 0x45d5830> (entity: JGLogEntry; id: 0x4baccb0 <x-coredata://B597E13E-BE74-402E-BF00-5E1D57898406/JGLogEntry/p13942> ; data: {
duration = nil;
item = nil; // <<< Here's the problem.
processBundleID = nil;
processID = nil;
processName = nil;
startTime = 2009-10-09 16:41:44 +0100;
stopTime = 2009-10-09 16:42:17 +0100;
windowDocumentPathOrURL = nil;
windowID = nil;
windowTitle = nil;
これはすべて、アイテムに接続されている関係が削除されたことを示しています。これは必須のプロパティであるため、検証エラーがあることがわかります。他の必須プロパティであるアプリケーションにも全体的な負荷があります。
私が見ているように、問題は検証エラー自体ではなく、関係をまったく移行していないように見えることです。
これで髪を抜いています。私は本当に、本当にいくつかの助けに感謝します。そして最後に、スターウォーズの引用:
「助けてください、StackOverflow。あなたが私の唯一の希望です。」