CoreData のバージョン移行で奇妙なバグが発生しました。それはクラッシュし、私は完全に困惑しています。xcdatamodel のバージョン 2 で 1 つの子エンティティに 2 つの新しい属性を追加し、それを現在のバージョンとして設定しました。永続ストア コーディネーターを作成するコードは次のようになります。
NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"MyModel" withExtension:@"momd"];
self.mainModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
self.mainQueueManagedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
self.persistentStoreCoordinator = [self storeCoordinatorForDB:@"MyDB.sqlite" objectModel:self.mainModel managedObjectContext:self.mainQueueManagedObjectContext];
- (NSPersistentStoreCoordinator *)storeCoordinatorForDB:(NSString *)dbName objectModel:(NSManagedObjectModel *)model managedObjectContext:(NSManagedObjectContext *)moc {
NSFileManager *fm = [NSFileManager defaultManager];
NSURL *storeURL = [[fm URLsForDirectory:NSApplicationSupportDirectory
inDomains:NSUserDomainMask] lastObject];
if (!storeURL) {
return nil;
}
else {
NSError *createError = nil;
BOOL createSuccess = [fm createDirectoryAtURL:storeURL withIntermediateDirectories:YES attributes:nil error:&createError];
if (!createSuccess) {
NSLog(@"Dir creation error: %@", createError);
}
}
storeURL = [storeURL URLByAppendingPathComponent:dbName];
NSURL *mainBundleDBURL = [[[NSBundle mainBundle] bundleURL] URLByAppendingPathComponent:dbName];
NSError *copyError = nil;
BOOL copySuccess = [fm copyItemAtURL:mainBundleDBURL toURL:storeURL error:©Error];
if (!copySuccess) {
NSLog(@"File copy error: %@", copyError);
}
NSError *error = nil;
NSPersistentStoreCoordinator *coordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:model];
moc.persistentStoreCoordinator = coordinator;
NSPersistentStore *ps = [coordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:@{
NSMigratePersistentStoresAutomaticallyOption:@(YES),
NSInferMappingModelAutomaticallyOption:@(YES)
} error:&error];
if (!ps) {
NSLog(@"Unresolved error adding persistent store: %@", error);
return nil;
}
return coordinator;
}
MyDB.sqlite は、xcdatamodel の以前のバージョンから事前にシードされた CoreData ファイルです。
これにより、(私が知る限り)絶対に偽のアドレスで EXC_BAD_ACCESS が発生します。0x0 または 0x16)
結果のスタックトレースは次のとおりです。
Exception Type: EXC_BAD_ACCESS (SIGSEGV)
Exception Codes: KERN_INVALID_ADDRESS at 0x00000000
Crashed Thread: 0
Thread 0 name: Dispatch queue: com.apple.main-thread
Thread 0 Crashed:
0 libobjc.A.dylib 0x3b2f95d6 objc_msgSend + 22
1 CoreData 0x333e5274 -[NSFetchedPropertyDescription copyWithZone:] + 140
2 CoreData 0x333d8f62 -[NSEntityDescription copyWithZone:] + 682
3 CoreData 0x333d8e70 -[NSEntityDescription copyWithZone:] + 440
4 CoreData 0x3340f4a8 -[NSManagedObjectModel copyWithZone:] + 340
5 CoreData 0x3341d20e -[NSMigrationManager initWithSourceModel:destinationModel:] + 178
6 CoreData 0x3346dc5e -[NSStoreMigrationPolicy managerForSourceModel:destinationModel:error:] + 390
7 CoreData 0x3346f060 -[NSStoreMigrationPolicy(InternalMethods) _gatherDataAndPerformMigration:] + 1596
8 CoreData 0x3339235c -[NSPersistentStoreCoordinator addPersistentStoreWithType:configuration:URL:options:error:] + 3340
9 ActorsNetwork 0x000ba072 -[DataStore storeCoordinatorForDB:objectModel:managedObjectContext:] (DataStore.m:69)
何が起こっているのか、またはこれをデバッグする方法について役立つヒントを知っている人はいますか? 楽器の割り当てを試しましたが、それ以上は進みませんでした。
【解決済み】ちょっと。モデルにフェッチされたプロパティ定義がありました。それを削除すると、インポートのクラッシュが修正されました。