PBDCoreDataMigrationAssistant 1.0.4

PBDCoreDataMigrationAssistant 1.0.4

测试已测试
Lang语言 Obj-CObjective C
许可 MIT
发布最后发布2016 年 10 月

Pawel Dudek 维护。



  • 作者
  • Paweł Dudek

问题

您可能还记得因为您的应用在未创建新版本的情况下修改模型而导致 Core Data 迁移失败时所有那些令人头疼的问题。

或者也许您有处理这种情况的代码 - 通过完全删除存储。但这也不是完美的解决方案 - 用户将丢失他们的数据。最好的情况是他们需要重新下载。最坏的情况是数据永远丢失。

解决方案

进入 PBDCoreDataMigrationAssistant。这个小巧的框架旨在通过确保您的应用始终可以访问之前的 NSManagedObjectModel 版本来简化与 Core Data 版本的工作,并且会自动为您执行迁移(如果有可能,请参见以下内容)。

使用方法

您应该使用以下方式创建 PBDCoreDataMigrationAssistant 的实例

- (instancetype)initWithStoreURL:(NSURL *)storeURL sourceModel:(NSManagedObjectModel *)sourceModel destinationModel:(NSManagedObjectModel *)destinationModel;

存储 URL 自然是您的持久存储 URL。源模型是您之前使用 PBDManagedObjectModelController 保存的模型(参见以下内容)。目标模型是您当前的模型。

使用以下方式执行迁移

- (BOOL)migrateStoreWithError:(NSError **)error;

如果迁移成功,方法将返回 YES,如果失败,则返回 NO。您可以通过 error 查询更多关于迁移失败的原因。

另外,如果无法自动推断模型映射(即需要重迁移)时,PBDCoreDataMigrationAssistant 将向其 id<PBDMigrationAssistantDelegate> 代理请求映射模型。如果没有提供模型,迁移将失败。

示例用法

在持久控制器的初始化方法中,您应该创建一个 PBDManagedObjectModelController 的实例

self.modelController = [[PBDManagedObjectModelController alloc] initWithManagedObjectModelURL:[self modelURL]];

然后,在设置堆栈时,您应该检查是否已保存模型及其是否与您目前在应用程序包中的内容有所不同。如果是这样,您应尝试执行迁移

NSManagedObjectModel *unarchivedModel = [[self modelController] unarchivedManagedObjectModel];

if (unarchivedModel && ![unarchivedModel isEqual:model]) {
    PBDCoreDataMigrationAssistant *migrationAssistant = [[PBDCoreDataMigrationAssistant alloc] initWithStoreURL:self.storeURL
                                                                                                        sourceModel:unarchivedModel
                                                                                                   destinationModel:model];
    [migrationAssistant migrateStoreWithError:nil];
}
[self.modelController archiveManagedObjectModel:model];

PBDManagedObjectModelController

这是一个帮助类,其目的是帮助您保存托管对象模型。您应该使用您希望存储 NSManagedObjectModel 的URL实例化它。使用您的应用程序库文件夹是推荐的。使用

- (NSManagedObjectModel *)unarchivedManagedObjectModel;

来获取现有的模型(如果没有可用的模型,将返回 nil)。

您应该使用

- (void)archiveManagedObjectModel:(NSManagedObjectModel *)model;

将您的模型写入给定的URL。