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

12

我的计划是删除旧的Core Data堆栈(包括NSManagedObjectModel .momd文件和NSPersistentStore .sqlite文件),因为:

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

在这种情况下,完全删除是否是迁移的最佳方法?

2个回答

14

如果您的应用程序需要互联网访问,这是完全有效的操作。否则,用户可能会得到一个空数据集(当您发现旧数据库与当前模型不兼容时,您将删除旧数据库,但无法重新填充它而不访问服务器)。

技术上,这是一件微不足道的事情。当您设置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];

我在更新后的初始启动中遇到了“SQLite error code:11,'database disk image is malformed'”错误。但是在随后的启动中,由于sqlite文件被删除,这不再是问题。但似乎我无法避免一次应用程序崩溃。而且,因为更新后应用程序立即崩溃,感觉有点令人失望。有什么建议吗? - raw3d

3
如果你创建了一个空的Core Data应用程序,你可以在苹果的应用委托中找到必要的代码:
如果在开发过程中遇到模式不兼容错误,可以通过以下方式减少其发生频率:
- 简单删除现有存储:[[NSFileManager defaultManager] removeItemAtURL:storeURL error:nil] - 通过将以下字典作为选项参数传递来执行自动轻量级迁移:@{NSMigratePersistentStoresAutomaticallyOption:@YES, NSInferMappingModelAutomaticallyOption:@YES}。轻量级迁移仅适用于有限的模式更改集合;有关详细信息,请参阅“Core Data模型版本控制和数据迁移编程指南”。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接