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 チュートリアルでは非常に簡単に聞こえますが、私はこれに長い間苦労しており、モデルのバージョンを変更した後は機能しませんでした。