核心数据迁移:如何删除核心数据栈?

我的计划是删除旧的核心数据堆栈( NSManagedObjectModel .momd文件和NSPersistentStore .sqlite文件),因为:

  • 我没有Core Data迁移的经验。
  • 新的.xcdatamodel模式与旧模式完全不同。
  • 我可以安全地删除用户的旧数据,因为它们都存储在我们的服务器上,新的应用程序无论如何都会从我们的服务器下载最新的数据。

在这种情况下,完全删除是迁移的最佳途径?

无论如何,如果你的应用程序需要互联网访问,这是一个非常有效的做法。 否则,用户可能会留下一个空的数据集(当您发现它与当前模型不兼容时删除旧的数据库,但无法访问服务器就无法重新填充它)。

从技术上讲,这是一个微不足道的事情。 当您设置NSPersistentStoreCoordinator

 NSURL *storeURL = ...; NSManagedObjectModel *managedObjectModel = ...; NSError *error = nil; _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel: managedObjectModel]; // Check if we already have a persistent store if ( [[NSFileManager defaultManager] fileExistsAtPath: [storeURL path]] ) { NSDictionary *existingPersistentStoreMetadata = [NSPersistentStoreCoordinator metadataForPersistentStoreOfType: NSSQLiteStoreType URL: storeURL error: &error]; if ( !existingPersistentStoreMetadata ) { // Something *really* bad has happened to the persistent store [NSException raise: NSInternalInconsistencyException format: @"Failed to read metadata for persistent store %@: %@", storeURL, error]; } if ( ![managedObjectModel isConfiguration: nil compatibleWithStoreMetadata: existingPersistentStoreMetadata] ) { if ( ![[NSFileManager defaultManager] removeItemAtURL: storeURL error: &error] ) NSLog(@"*** Could not delete persistent store, %@", error); } // else the existing persistent store is compatible with the current model - nice! } // else no database file yet [_persistentStoreCoordinator addPersistentStoreWithType: NSSQLiteStoreType configuration: nil URL: storeURL options: nil error: &error]; 

如果您创build一个空白的核心数据应用程序,您可以在应用程序委托中的Apples注释中find必要的代码:

如果在开发过程中遇到模式不兼容性错误,可以通过以下方法降低其频率:

  • 简单地删除已有的存储:[[NSFileManager defaultManager] removeItemAtURL:storeURL error:nil]

  • 通过传递以下字典作为选项参数来执行自动轻量级迁移:@ {NSMigratePersistentStoresAutomaticallyOption:@YES,NSInferMappingModelAutomaticallyOption:@YES}轻量级迁移仅适用于一组有限的模式更改; 有关详细信息,请参阅“核心数据模型版本控制和数据迁移编程指南”。