Core Data+sqliteをデータキャッシュとして使用しています。アプリはファイルをコアデータに読み込み、コアデータを使用してアプリを実行します。保存は、NSManagedObjectContextとファイルの両方に対して行われます。ただし、Core Dataデータベースにデータを再入力せずにアプリを終了してリロードすると、-save:を使用して保存されたデータの一部(すべてではない)がデータストアに保存されないことに気付きました。
管理対象オブジェクトへの変更はすべてメインスレッドで1つのバッチで行われ、すべての変更が完了した後に-save:メッセージが送信されます。保存されていないデータは、変換可能な属性であり、コアデータオブジェクト内の唯一の変換可能な属性です。オブジェクトを保存するコードは次のとおりです。
NSInteger columnIndex = [headers indexOfObject:questionID];
if (NSNotFound != columnIndex) {
// parsedLine is a mutable array already
NSMutableArray *parsedLine = person.dataFromFile.parsedLine;
[parsedLine replaceObjectAtIndex:columnIndex withObject:answer];
person.dataFromFile.parsedLine = parsedLine;
person.questionsAnsweredByPerson = [NSNumber numberWithInt:[FileParser questionsAnsweredInRow:person.dataFromFile.parsedLine withRowHeaders:headers]];
person.address.street.questionsAnsweredByPeopleOnStreet = [NSNumber numberWithInt:[self questionsAnsweredByPeopleOnStreet]];
//NSLog(@"rawLineBefore:\n%@", person.dataFromFile.rawLine);
person.dataFromFile.rawLine = [ReconstructCSV composeCSVLineFromArray:person.dataFromFile.parsedLine];
//NSLog(@"rawLineAfter:\n%@", person.dataFromFile.rawLine);
Voter_SurveyAppDelegate *appDelegate = (Voter_SurveyAppDelegate *)[[UIApplication sharedApplication] delegate];
NSError *error;
NSManagedObjectContext *managedObjectContext = [appDelegate managedObjectContext];
if (![managedObjectContext save:&error]) {
// XXX inform the user there was a fatal error opening the file. Low disk space?
NSLog(@"Unresolved error - could not save managedObjectContext - %@, %@", error, [error userInfo]);
abort();
}
return YES;
}
アボート(); 呼び出されないので、-saveと仮定します。正しく呼び出されています。
関連しているとは思えませんが、このコードをメインスレッドで実行した後、別のスレッドで新しいNSManagedObjectContextを使用してNSFetchRequestを実行します。他のスレッドのコアデータに関連する他のことは何も起こりません。
変換可能な属性が保存されないのはなぜですか?