删除核心数据持久性存储而不是迁移(也使用RestKit)

PFa*_*nik 7 core-data ios restkit

我正在对我们的应用程序升级版本的对象模型进行相当多的更改,即.添加/删除实体,新属性和关系.看起来这项工作真的可以为正确的核心数据迁移做好准备.由于数据主要用作缓存以增强离线浏览体验.在这一点上真的不需要迁移我认为如果它被吹走并重新创建将会更加简单.

根据我在这个主题上遇到的各种帖子,总体策略是

  • 检测模型是否已更改(通过在managedObjectContext初始化期间捕获异常)
  • 删除持久存储(在我们的例子中是iOS上的sqlite文件)
  • 使用最新模式重新初始化objectModel,使用新模型重新初始化持久性存储

这是重新初始化objectModel的代码

- (NSManagedObjectModel *)managedObjectModel {

if (managedObjectModel != nil) {
    return managedObjectModel;
}

NSString *path = [[NSBundle mainBundle] pathForResource:@"<model name>" ofType:@"momd"];
NSURL *momURL = [NSURL fileURLWithPath:path];
managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:momURL];

return managedObjectModel; 
}
Run Code Online (Sandbox Code Playgroud)

并重新创建objectModel并存储

objectManager = [RKObjectManager objectManagerWithBaseURL:
                     [NSString stringWithFormat:@"http://%@/v3", 
                      [[NSBundle mainBundle] objectForInfoDictionaryKey:@"APIDomain"]]];     
NSManagedObjectModel *objectModel = [self managedObjectModel];
objectManager.objectStore = [RKManagedObjectStore objectStoreWithStoreFilename:storeName usingSeedDatabaseName:nil managedObjectModel:objectModel delegate:nil]; 
Run Code Online (Sandbox Code Playgroud)

但是,我收到以下错误:

由于未捕获的异常'NSInternalInconsistencyException'而终止应用程序,原因:'+ entityForName:找不到实体名称'UTCity'的NSManagedObjectModel'

我觉得它非常接近,因为重新启动应用程序成功创建新商店正确运行.

-PF

Cha*_*zak 6

我想我已经能够通过实现一个方法来做你所描述的RKManagedObjectStoreDelegate.当持久性存储创建失败时调用该方法.我只是在调用此方法时删除持久存储.RestKit似乎从这里恢复得很好.我假设它在下次需要时创建了新的空白商店.

- (void)managedObjectStore:(RKManagedObjectStore *)objectStore didFailToCreatePersistentStoreCoordinatorWithError:(NSError *)error {
    [objectStore deletePersistentStore];
}
Run Code Online (Sandbox Code Playgroud)

RKManagedObjectStore尝试在初始化时创建持久性存储,因此您需要RKManagedObjectStore通过接受委托对象的方法之一初始化您的实例.我刚刚通过了我的app委托.

到目前为止,这似乎有效.在我继续开发的过程中,我们会看到它是否会继续这样做.