【问题标题】:Override Coredata DB With A New Structure DB使用新结构 DB 覆盖 Coredata DB
【发布时间】:2011-03-17 22:32:10
【问题描述】:

好的,我希望你能帮我解决这个问题。我真的需要你的帮助。

我在应用商店中有一个使用种子数据库的应用程序(如果不存在,请检查应用程序委托中的“persistentStoreCoordinator”方法中是否存在该数据库,如果不存在则复制种子数据库)。

问题是我改变了数据库结构,当然还有种子数据库结构。并将更新发布到应用商店。当用户更新应用程序并打开它时,应用程序崩溃。因为检查文档文件夹中是否存在数据库的代码可以找到数据库,因此它将在需要新数据库结构的应用程序中使用旧数据库。

我想知道如何克服这个问题。问题是我不能只替换现有的数据库,因为那样我将无法复制种子数据库。

请帮帮我:)

【问题讨论】:

    标签: iphone sqlite core-data


    【解决方案1】:

    为什么要更改数据库结构而不是数据模型? Core Data 不是数据库。它旨在将数据库抽象出来,因此您不必考虑它。如果你需要直接操作数据库,你应该使用 SQLite。

    Core Data 提供自动和手动模型迁移,允许您更改数据模型并让 Core Data 负责数据库。说真的,Core Data 的全部意义在于您永远不必直接处理数据库。

    【讨论】:

    • 感谢您的解释,我明白了。我将尝试研究 Greg C 给我的迁移指南。我会努力寻找更好的解决方案。
    • +1 精通 SQL 和类似 DB 的人常常会因为认为 Core Data 只是 SQL 的对象包装器而感到悲痛。事实并非如此,您为 SQL 学习的绝大多数技能和技术在使用 Core Data 时不仅无用而且非常危险。
    【解决方案2】:

    通常您要做的是将现有数据库迁移到新的数据库模型。如果更改很简单,您很可能可以摆脱所谓的轻量级迁移。看看Introduction to Core Data Model Versioning and Data Migration Programming Guide

    【讨论】:

    • 感谢您提供的链接,它将非常有帮助。
    【解决方案3】:

    好的,我通过检查应用程序是否第一次打开来解决了这个问题。如果是真的,那么我将删除旧数据库,然后放入种子数据库(使用新模型)。

    我使用了这个代码:

    if(![[NSUserDefaults standardUserDefaults] boolForKey:@"firsttimer"] ) {
        if ([fileManager fileExistsAtPath:storePath]) {
            [fileManager removeItemAtPath:storePath error:nil];
        }
        [[NSUserDefaults standardUserDefaults] setBool:TRUE forKey:@"firsttimer"];
    }
    

    【讨论】:

    • 您应该编辑您的问题,而不是发布这样的答案。
    猜你喜欢
    • 1970-01-01
    • 2023-02-17
    • 1970-01-01
    • 2012-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-06
    • 1970-01-01
    相关资源
    最近更新 更多