【问题标题】:How to migrate core data by deleting old one on App Update如何通过在 App Update 上删除旧数据来迁移核心数据
【发布时间】:2013-09-08 06:25:58
【问题描述】:

您好,我将在 appstore 中更新我的 iOS 应用程序,此更新包含数据库更改,那么现在如何通过删除应用程序更新时现有版本的旧数据库来迁移我现有的核心数据? 我已经转介Core Data Migration tutorial

Core Data Migration Post

不幸的是没有用。提前感谢任何帮助

【问题讨论】:

  • 什么是“没用”?你读过苹果指南吗?
  • 如果您想删除旧数据库,为什么还要阅读迁移?这不是一种迁移形式。你想了解– removeItemAtPath:error:NSFileManager。或者我应该问如果你想迁移,你为什么要谈论删除?我希望这个数据库里没有一条用户数据。

标签: iphone ios objective-c core-data core-data-migration


【解决方案1】:

史密斯,
我想您已经在 xcdatamodel 中进行了一些架构更改
始终,如果您的应用程序已经提交到 App Store 并且使用的是较早的模型版本,则在进行任何更改之前添加一个新的模型版本(选择 name.xcdatamodeld 然后编辑器->添加模型版本)。
那么,
从核心数据选项卡添加一个新文件,作为映射模型
选择,Source Model(提交的App使用的模型版本)
目标模型(您已完成更改的模型版本)

你完成了!

【讨论】:

  • 感谢您在映射模型后的回复,我是否需要做任何代码更改,说明我已在 + (NSPersistentStoreCoordinator *)persistentStoreCoordinator 方法中使用映射模型?
  • 什么都没有,只要确保从 .xcdatamodel 中选择最新的模型版本
  • 嗨@Piyush,我按照你说的做了,而且效果很好,谢谢...我是否必须为每次升级创建并保留一个映射模型?
  • @Balz 如果您对模型进行任何更改,那么它将与早期版本不兼容。对于模型中关于更改属性等的更改,您可以使用Lightweight Migration。查看链接了解更多信息。
  • 太棒了。谢谢
【解决方案2】:

您是否可能在应用自动迁移之前尚未创建新版本的数据库模型?

  1. 从项目浏览器中选择 [dbname].xcdatamodeld。
  2. 选择编辑器->添加模型版本。
  3. 根据您当前的型号选择。
  4. 确保您有这样的自动迁移选项:

    -(NSPersistentStoreCoordinator *)storeCoordinator {
    
    if (storeCoordinator_ != nil) {
        return storeCoordinator_;
    }
    
    NSURL *storeURL = [NSURL fileURLWithPath: [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @"[dbname].sqlite"]];
    
    NSDictionary* storeOptions = @{NSMigratePersistentStoresAutomaticallyOption : [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption : [NSNumber numberWithBool:YES]}; 
    
    NSError *error = nil;
    storeCoordinator_ = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self objectModel]];
    
    if (![storeCoordinator_ addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:storeOptions error:&error]) {
    
        // handle error here and remove abort
    
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    }
    
    return storeCoordinator_;
    }
    
  5. 你走吧。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-14
    • 2011-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-18
    • 2019-03-22
    相关资源
    最近更新 更多