我的计划是删除旧的Core Data堆栈(包括NSManagedObjectModel
.momd
文件和NSPersistentStore
.sqlite
文件),因为:
- 我没有Core Data迁移方面的经验。
- 新的 .xcdatamodel模式与旧模式完全不同。
- 我可以安全地删除用户的旧数据,因为所有数据都存储在我们的服务器上,新应用程序无论如何都会从我们的服务器下载最新数据。
在这种情况下,完全删除是否是迁移的最佳方法?
我的计划是删除旧的Core Data堆栈(包括NSManagedObjectModel
.momd
文件和NSPersistentStore
.sqlite
文件),因为:
在这种情况下,完全删除是否是迁移的最佳方法?
如果您的应用程序需要互联网访问,这是完全有效的操作。否则,用户可能会得到一个空数据集(当您发现旧数据库与当前模型不兼容时,您将删除旧数据库,但无法重新填充它而不访问服务器)。
技术上,这是一件微不足道的事情。当您设置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];