web-dev-qa-db-ja.com

Xcodeデータモデルを変更した後も「保存操作の失敗」が発生し続けます

IPhone開発にコアデータを使い始めました。私は、1つの文字列プロパティ(evaluationTopicと呼ばれる)を持つ非常に単純なエンティティ(Evaluationと呼ばれる)を作成することから始めました。新しい文字列を挿入するための次のコードがありました。

- (void)insertNewObject {

    // Create a new instance of the entity managed by the fetched results controller.
    NSManagedObjectContext *context = [fetchedResultsController managedObjectContext];
    NSEntityDescription *entity = [[fetchedResultsController fetchRequest] entity];
    NSManagedObject *newManagedObject = [NSEntityDescription insertNewObjectForEntityForName:[entity name] inManagedObjectContext:context];

    // If appropriate, configure the new managed object.
    [newManagedObject setValue:@"My Repeating String" forKey:@"evaluationTopic"];

    // Save the context.
    NSError *error;
    if (![context save:&error]) {
        // Handle the error...
    }

    [self.tableView reloadData];
}

これは完全に正常に機能し、+ボタンを押すと、新しい「My Repeating String」がテーブルビューに追加され、永続ストアに保存されます。

次に、Xcodeで[デザイン]-> [モデルバージョンの追加]を押しました。既存のエンティティに3つのエンティティを追加し、既存の「評価」エンティティに新しいプロパティも追加しました。次に、[ファイル]-> [新しいファイル]-> [管理対象オブジェクトクラス]を押してエンティティから新しいファイルを作成し、Evaluation.hとEvaluationを使用した「Evaluation」エンティティを含む4つのエンティティの新しい.hファイルと.mファイルを作成しました。 .m。ここで、「デザイン->データモデル->現在のバージョンの設定」を設定してモデルのバージョンを変更しました。これをすべて行った後、insertMethodを変更しました。

- (void)insertNewObject {

    // Create a new instance of the entity managed by the fetched results controller.
    NSManagedObjectContext *context = [fetchedResultsController managedObjectContext];
    NSEntityDescription *entity = [[fetchedResultsController fetchRequest] entity];
    Evaluation *evaluation = (Evaluation *) [NSEntityDescription insertNewObjectForEntityForName:[entity name] inManagedObjectContext:context];

    // If appropriate, configure the new managed object.
    [evaluation setValue:@"My even new string" forKey:@"evaluationSpeechTopic"];

    // Save the context.
    NSError *error;
    if (![context save:&error]) {
        // Handle the error...
    }

    [self.tableView reloadData];
}

しかし、これは機能しません!行を追加するたびにシミュレーターがクラッシュし、次のようになります。

"NSInternalInconsistencyException', reason: 'This NSPersistentStoreCoordinator has no persistent stores.  It cannot perform a save operation.'"

データモデルで何かを変更した後、新しいバージョンを作成することを知る前にこのエラーが発生しましたが、なぜこれがまだ発生するのですか?マッピングを行う必要がありますか(以前は存在しなかったエンティティとプロパティを追加しただけですが)。 Apple Devチュートリアルでは非常に簡単に聞こえますが、私はこれに長い間苦労しており、モデルのバージョンを変更した後は機能しませんでした。

22
Philip Schoch

アプリデリゲートでpersistentStoreCoordinatorを作成するときに、NSMigratePersistentStoresAutomaticallyOptionオプションとNSInferMappingModelAutomaticallyOptionオプションが設定されていますか?

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {

    if (persistentStoreCoordinator != nil) {
        return persistentStoreCoordinator;
    }

    NSURL *storeUrl = [NSURL fileURLWithPath: [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @"database.sqlite"]];

    NSError *error = nil;
    NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
                             [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
                             [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];
    persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel: [self managedObjectModel]];
    if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:options error:&error]) {
        // Handle error
    }    

    return persistentStoreCoordinator;
}
50
hanleyp

シミュレーターでこのエラーが発生するだけの場合は、データモデルを変更しており、以前に使用していたsqliteファイルは削除されていません。

したがって、次の場所に移動します:~/Library/Application Support/iPhone Simulator/User/Applications/

次に、アプリが表示されるまで、HEXという名前のフォルダーを調べます。 Documentsディレクトリを開き、sqliteファイルを削除します。エラーはなくなるはずです。

30
Michael Gaylord

シミュレーター/ iPhoneでこれを実行している場合は、アプリもアンインストールしてください。私がアプリを削除した後にのみ、シミュレーターで私のために働きました!

10
geodude

シミュレーターとデバイスの両方でアプリを削除して再インストールすると、うまくいきました。

4
elvitucho

これは、アプリには他のデータベースがあり、ライブラリ/アプリケーションサポート/ iPhoneシミュレーター/ユーザー/アプリケーションには他のデータベースがあるため、データベースが変更されたためです.... so [〜#〜] delete [〜#〜 ]アプリケーションフォルダからのデータベースは私のために働きます。

3
abhinav

マイケルの答えは私の場合に合っています。
コアデータモデルを変更しましたが、このエラーが発生し始めました。
私の解決策は、アプリを削除し(HOMEを押しながらアプリをクロス)、アプリを再起動することでした。問題が解決しました!

0
Stove

シミュレータで「コンテンツと設定をリセット...」を試すこともできます。それが私のために働いたものです。

0
njyulan

Finderの別のフォルダーにコードをコピーしてそのプロジェクトの編集を開始し、エラーが発生するまで、同じ問題が発生し、以前は機能していました。私の他のプロジェクトにはxyz.sqliteという名前のstorecordinatorがあり、私が取り組んでいた「新しい」プロジェクトには同じ名前があり、xyzv2.sqlite(そのようなもの)に変更する必要がありました。ここで答えが見つかりました: http://www.iphonedevsdk.com/forum/iphone-sdk-development/27268-nspersistentstorecoordinator-has-no-persistent-stores.html

0
Tim Maxey