1

CoreData Model にいくつかの変更を加えました。ここまでで、「言語」という属性を追加しました。アプリケーションを起動して [Create new Customer] をクリックすると、インスタンス変数 Customer が作成されます。この変数は次によって作成されます。

Customer *newCustomer = [NSEntityDescription insertNewObjectForEntityForName:@"Customer" inManagedObjectContext:appDelegate.managedObjectContext];

これらの変更を行う前は、すべてが正常に機能し、計画どおりに機能していました。しかし今、私はこのエラーメッセージでダンプを取得します:reason = "The model used to open the store is incompatible with the one used to create the store";

これを解決するにはどうすればよいですか? 永続ストアをリセットしても、これまでのところ役に立ちませんでした。

4

2 に答える 2

2

この問題を回避するために私がしたことは、これを追加することでした

[[NSFileManager defaultManager] removeItemAtURL:storeURL エラー:nil];

永続ストアを追加する前に、persistentStoreCoordinator の appDelegate に追加します。これにより、データ モデルとの互換性がなくなった既存のストアが削除されます。保存されているものを保持したい場合は、次回アプリケーションを実行する前に、この行をコメントすることを忘れないでください。

古いストアを削除する必要がある場合、persistentStoreCoordinator の実装は次のようになります。

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {

if (persistentStoreCoordinator_ != nil) {
    return persistentStoreCoordinator_;
}
NSError *error = nil;
NSURL *storeURL = [NSURL fileURLWithPath: [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @"MyPinballScore.sqlite"]];
//The following line removes your current store so that you can create a new one that is compatible with your new model
[[NSFileManager defaultManager] removeItemAtURL:storeURL error:nil];

persistentStoreCoordinator_ = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
if (![persistentStoreCoordinator_ addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) {

    NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
    abort();
}    

return persistentStoreCoordinator_;

}

于 2010-10-06T13:35:22.887 に答える
0

答えは少しトリッキーですが、これは常にうまくいきます。これは、新しい互換性のある .sqlite ファイルのクリーンインストール用であり、移行用ではありません!

シミュレーターを起動し、アプリとデータを削除します (アプリを削除した後のポップアップ)。

シミュレーターを終了する

データモデルを編集した後、X-Code を開きます

ファイルを削除し{*appname*}.sqliteます (またはバックアップし、プロジェクト フォルダーから削除し、参照を削除します)。

アプリをきれいにする ( Product > Clean)

シミュレーターでアプリを実行します (このチュートリアルでは、4.2 を想定しています)

シミュレーターの実行中に、Finder ウィンドウで次の場所に移動します。 {*home*} > Library > Application Support > iPhone Simulator > 4.2 > Applications > {*random identifier*} > Documents > {*appname*}.sqlite

このファイルを別の場所にコピーします

X-Code でのアプリの実行を停止する

{ appname }.sqlite ファイルを X-Code のファイル リストにドラッグ アンド ドロップします。

ポップアップするダイアログで、copy to folderチェックボックスがオンになっていることを確認します。

Product > Clean

次に、シミュレーターでアプリを再度実行します

これで、動作する sqlite ファイルが作成されました!

乾杯、ロバート

于 2011-11-23T02:03:05.787 に答える