iOS の Core Data に奇妙な問題があり、再現できないようです。それを報告する一部のユーザーで時々発生します。iOS クラッシュ レポートから得られるエラー:
CoreData: -[NSPersistentStoreCoordinator _coordinator_you_never_successfully_opened_the_database_so_ Saving_back_to_it_is_kinda_hard:] + 56
スクリーンショットは次のとおりです (製品名は省略されています)。
難しいのは、そのエラーで検索結果が得られないことです。ここに私の(関連する)コードがあります:
保存:
-(void)save
{
if(!self.horecaMOC.hasChanges)return;
NSError *error;
[self.horecaMOC save:&error];
if(error)
{
NSLog(@"save error %@",error.localizedDescription);
}
}
モック:
-(NSManagedObjectContext*)horecaMOC
{
if(!_horecaMOC)
{
NSPersistentStoreCoordinator *coordinator = self.horecaPSC;
if (coordinator != nil) {
_horecaMOC = [[NSManagedObjectContext alloc] init];
[_horecaMOC setPersistentStoreCoordinator:coordinator];
}
}
return _horecaMOC;
}
PSC:
-(NSPersistentStoreCoordinator*)horecaPSC
{
if(!_horecaPSC)
{
NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"horeca.sqlite"];
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
[NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption,
nil];
NSError *error = nil;
_horecaPSC = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:self.horecaMOM];
if (![_horecaPSC addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error]) {
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
}
return _horecaPSC;
}
議事録:
-(NSManagedObjectModel*)horecaMOM
{
if(!_horecaMOM)
{
NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"poi" withExtension:@"momd"];
_horecaMOM = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
}
return _horecaMOM;
}
99% の確率で動作するため、セットアップは問題ないように見えますが、データベースを開いていないというエラーが表示されることがあります。デバッグできないので、原因を突き止めるのは難しいです。PSCはゼロになるのでしょうか?そして、それはなぜでしょうか?また、MOC は 1 つのスレッドのみにバインドする必要があることを知っていますが、クラッシュさせることができないため、これに関して問題があるとは思いませんか?
アドバイスをありがとう!