22

Core Data を 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 つのエンティティを追加し、既存の「評価」エンティティにも新しいプロパティを追加しました。次に、"File -> New File -> Managed Object Classes" を押してエンティティから新しいファイルを作成し、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 チュートリアルでは非常に簡単に聞こえますが、私はこれに長い間苦労しており、モデルのバージョンを変更した後は機能しませんでした。

4

8 に答える 8

50

App Delegate で persistStoreCoordinator を作成するときに、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;
}
于 2009-07-07T13:32:18.767 に答える
30

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

だから行く:~/Library/Application Support/iPhone Simulator/User/Applications/

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

于 2010-06-29T08:27:04.780 に答える
10

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

于 2010-10-01T06:45:50.663 に答える
4

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

于 2012-01-05T17:10:04.123 に答える
3

アプリには他のデータベースがあり、ライブラリ/アプリケーションサポート/iPhoneシミュレータ/ユーザー/アプリケーションには他のデータベースがあるため、これはデータベースの変更によるものです....だから、アプリケーションフォルダからデータベースを削除してください。

于 2013-03-13T06:23:39.690 に答える
0

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

于 2012-05-13T13:13:16.590 に答える
0

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

于 2011-09-13T18:37:22.317 に答える