【问题标题】:Updating Core data with existing sqlite db使用现有 sqlite db 更新核心数据
【发布时间】:2014-04-11 16:59:23
【问题描述】:

我是 iOS 开发新手。我尝试在我的应用中更新现有的核心数据模型。我想在核心数据模型中添加一个新实体,但是当我在核心数据模型中更改任何内容时,应用程序崩溃。我不明白这些实体是如何与我现有的 sqlite 数据库表和列链接的。即使我更改实体或属性的名称,应用程序也会崩溃并给我这个错误 - “用于打开商店的模型与用于创建商店的模型不兼容。”

我总是在核心数据库发生任何更改但不起作用后重新安装模拟器中的应用程序。谁能建议我如何将核心数据与 sqlite 表和列链接以及如何迁移我的核心数据模型并在其中添加更多实体和属性它。

感谢您的任何建议!

【问题讨论】:

  • 您搜索过Core Data migration 吗?
  • 确保在运行应用程序之前已删除所有现有商店。

标签: ios sqlite core-data core-data-migration


【解决方案1】:

Apple 没有记录核心数据实体是如何保存在 sqlite 中的。除非您确切知道自己在做什么,否则不要触摸 sqlite 级别的数据。

如果您需要更改模型,请正确更改为 xcode 中的模型。

特别是:如果您在商店中有应用程序的早期版本或通过其他渠道分发,那么请考虑迁移策略。核心数据对此非常支持。为此,您将保留模型原始版本的副本并使用 xcode 创建该模型的新版本。如果更改只是关于附加实体或附加字段,则应该进行自动迁移。

【讨论】:

    【解决方案2】:

    如果您仍在开发过程中,您可以从模拟器中卸载应用程序(如在您的 iDevice 上:长按应用程序图标,然后按 X)

    您已经发布了您的应用程序:按照@wain 的建议,请查看有关核心数据迁移的优秀教程

    【讨论】:

      【解决方案3】:

      这是一次迁移。

      您需要创建一个新版本的核心数据模型(这在 Xcode 中完成),然后将新模型设置为当前版本。从那里您将实体添加到您的新版本。此外,您需要在 Core Data 中打开“自动”迁移,以便 Core Data 将您现有的数据从以前的版本迁移到新版本。

      您可以通过更改NSPersistentStoreCoordinator 初始化代码并添加选项来做到这一点:

      NSMutableDictionary *options = [NSMutableDictionary dictionary];
      options[NSMigratePersistentStoresAutomaticallyOption] = @YES;
      options[NSInferMappingModelAutomaticallyOption] = @YES;
      options[NSSQLitePragmasOption] = @{ @"journal_mode":@"DELETE" };
      
      NSError *error = nil;
      NSPersistentStore *store = [coordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error]);
      
      if (store == nil) {
        NSLog(@"Error initializing PSC: %@\n%@", [error localizedDescription], [error userInfo]);
      }
      

      如果您的商店无法(不太可能)自动迁移,那么您将需要执行大量迁移或手动迁移。您可以在 StackOverflow 上搜索关于该主题的各种讨论。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-26
        • 1970-01-01
        • 2014-08-01
        • 2011-03-07
        • 1970-01-01
        相关资源
        最近更新 更多