5

ALM は素晴らしいです。しかし、NSDocument で Core Data を使用するプロジェクトでは動作しません。ALM はデフォルトで無効になっているようです。

罰金。通常のプロジェクトでは、次の行で 2 つの適切なオプションを辞書に追加します。

if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:options error:&error])

...しかし、NSD で CD を使用する場合、その行は存在しません (NSPersistentDocument は詳細を非表示にし、それらを変更する方法がわかりません)。

次の方法は希望を与えるようです:

configurePersistentStoreCoordinatorForURL:ofType:modelConfiguration:storeOptions:error:

...(4 年以上前から) メーリング リストの何人かの人々は、そのメソッドをオーバーライドし、オプション ディクショナリを変更してから、"super" で再度呼び出すことに成功したと報告しています。悲しいことに、それは私にはうまくいきませんでした。同様の問題がある場合は、最初にそれを試すことをお勧めします-それでも機能しない場合は、ここに戻ってください:)

4

2 に答える 2

8

新しい Cored-Data-with-NSDocument プロジェクトをゼロから作成して、最初はうまくいかなかったアプローチを試してみましたが、今回はうまくいきました。

-(BOOL)configurePersistentStoreCoordinatorForURL:(NSURL *)url ofType:(NSString *)fileType modelConfiguration:(NSString *)configuration storeOptions:(NSDictionary *)storeOptions error:(NSError **)error
{
    NSMutableDictionary *newOptions = [NSMutableDictionary dictionaryWithDictionary:storeOptions];
    [newOptions setValue:@"YES" forKey:NSMigratePersistentStoresAutomaticallyOption];
    [newOptions setValue:@"TRUE" forKey:NSInferMappingModelAutomaticallyOption];

    return [super configurePersistentStoreCoordinatorForURL:url ofType:fileType modelConfiguration:configuration storeOptions:newOptions error:error];
}
于 2011-06-06T21:02:29.197 に答える
1

注: 私の問題の根本的な原因は、データ モデルのバージョンを追跡するために、Xcode4 がバージョン番号の代わりに使用するプライベート ハッシュを誤って更新していることだと思います。おそらく、誤って何かを追加してから削除したため、ハッシュが変更された可能性があります。元のモデルは非常に単純で、目で簡単に比較でき、違いはありませんでした。

また、より一般的に言えば、問題は Xcode4がまだCoreData プロジェクトを適切に処理しないことです。デフォルトで CoreData モデルを「バージョン管理された」ものとして作成します (役に立たないモデルを常に作成する運命にあった Xcode3 からの大幅な改善)。モデルの変更を処理ない- 変更を保存する前に手動でバージョンを更新することを忘れないでください (そうしないと、すべてのプロジェクトの移行が永遠に失敗し、解決策がありません)。

また、問題が発生すると、「正しい」解決策を見つけることができませんでした.AppleのCore Data libから欠落している部分が多すぎます. 基本的に: 私の知る限り、NSPersistentDocument は不完全で、サポートされていません。


最終的に、私は次の残忍な回避策を採用しました。古いバージョンを使用しているすべての人に、CoreData ストアを手動で編集して、現在のバージョンを実行していると主張するように指示しました。

これは 100% 機能します。CoreData とは異なり、私のアプリは、インポート時に明らかな欠落データをインテリジェントに修正するように作成されているためです。些細なことですが、CoreData では、「はい、これを実行しました。問題ありません。ファイルを開いてください」とは言えません。

  1. 古いバージョン: 「XML として保存」
  2. ファイルの先頭にコピー/貼り付けする新しいヘッダーを提供しました。注: Apple はバージョン番号の代わりにハッシュを使用しているため、実際にはそうではありませんが、これは恐ろしく見えます。Apple が独自のバージョン システムを無視し、代わりにハッシュを使用している理由がわかりません。
  3. 新しいバージョン: 更新されたファイルを開きます
  4. 新しいバージョンでは: 「保存」

...そして、NSManagedObject メソッドをオーバーライドしているため:

-awakeFromInsert

上記の手順 3 と 4 により、データが「自動的に」更新されます。

マッピング モデルを作成するのが「正しい」方法であることはわかっていますが、ほとんどの場合、これは非常にやり過ぎです...そして、Apple は最初から古いデータの読み込みを拒否していました。つまり、Core Data は、データの修正を許可することさえ拒否していました - 私のコードは喜んで修正していたにもかかわらずです。

(すべての古いプロジェクトは正しくインポートおよびエクスポートされました - 問題ありません)

IMHO: CoreData は、最初は考えられなかったすべてのエッジケースを修正するために、Apple 側で再設計する必要があります。


NB: 簡単な警告: awakeFromFetch 内の CoreData 変数を変更しないでください - Apple は、そのメソッドを呼び出す前に変更追跡を一時的に無効にします (これはちょっとばかげています - メソッドが他のすべての "awakeFrom*" の動作と互換性がなくなります)メソッド)。

Apple のアドバイス: awakeFromFetch 内で、何を変更するかを決定し、それをパッケージ化して、次のようなものを使用します。

[self performSelector:@selector(myAwakeFromFetchFixItemX:) withObject:X afterDelay:0.01];

...これを試している人のためにそれを追加すると思いました-そうしないと、インポートは正常に機能しますが、エクスポートは黙って固定データを含めることができません!

于 2011-05-30T14:10:48.013 に答える