我正在使用Core Data + sqlite作为数据缓存。应用程序将文件读入核心数据,然后使用Core Data运行应用程序。保存对NSManagedObjectContext和文件都进行了保存。但是,我注意到,如果我退出应用程序并重新加载它而不重新填充核心数据数据库,则使用-save:保存的一些(但不是全部)数据不会保存到数据存储中。
我的托管对象的更改都在主线程上的一个批处理中完成,并且在完成所有更改后发送-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。在其他线程上没有其他任何与Core Data相关的内容。
为什么不能保存可转换属性?
答案 0 :(得分:1)
问题是可转换属性不喜欢Mutable对象。如this question的答案中所述,NSMutableDictionary未被保存。就我而言,它是一个NSMutableArray。