在数据丢失预期且可接受的早期开发期间轻松迁移核心数据

时间:2016-05-24 23:17:26

标签: cocoa core-data nsmanagedobject nsmanagedobjectcontext nsmanagedobjectmodel

当Core Data应用程序处于早期开发阶段时,其管理对象模型通常会不断变化。对于每个构建,都会在模型中添加或删除新的托管对象和属性。

当托管对象模型发生更改时,应用程序将在下次运行时崩溃并显示错误:

  

用于打开商店的模型与用于创建商店的模型不兼容

common advice in this situation删除应用 from your device/simulator and re-run

这适用于使用Xcode的开发人员,但对于参与发布过程的非技术利益相关者来说却很烦人。最好不要向CEO或QA团队解释他们必须在从TestFlight安装更新之前删除应用程序。或者由此问题导致崩溃的bug。

模型最终确定后,我们将实施真正的核心数据迁移策略。

在这个开发阶段,数据丢失是可以接受和预期的。

在发布应用程序之前,将删除此方法。

在发布版之间“迁移”对托管对象模型的更改的最简单,轻量级,可移动,调试方式是什么?这可能相当于“删除应用并重新运行”,但无需手动删除应用。

这应该处理对Core Data堆栈的任何和所有更改,包括添加和删除托管对象和属性。

2 个答案:

答案 0 :(得分:2)

在这种情况下,我会检查当前模型的兼容性,然后在需要迁移的情况下删除SQLite数据库。

考虑使用(在Objective-C中)

// error, sourceStoreURL, theManagedObjectModel are valid

NSDictionary *storeMetadata=[NSPersistentStoreCoordinator metadataForPersistentStoreOfType: NSSQLiteStoreType
    URL: sourceStoreURL error: &error];
BOOL storeIsCurrent=[theManagedObjectModel isConfiguration: nil
    compatibleWithStoreMetadata: storeMetadata];
if (!storeIsCurrent)
{
    // Alert user
    // Delete on-disk store via sourceStoreURL
    // (including -wal and -shm files if journaling enabled)
}

答案 1 :(得分:1)

您可以在更改模型时更改商店URL。

即使是早期开发,您也可以进行模型版本控制,然后在发货前将其全部删除。这也可以帮助您的团队了解模型版本的细节。