首次应用启动时导入核心数据

Posted

技术标签:

【中文标题】首次应用启动时导入核心数据【英文标题】:Core Data import at first app launch 【发布时间】:2013-02-21 14:26:07 【问题描述】:

我在启动应用时遇到了数据导入问题。 在第一次启动时,我创建了很多核心数据对象(几乎 400 个对象)。 问题是,当我在模拟器中尝试应用程序时,一切似乎都是正确的,但在设备上,由于我的导入,我不得不等待很多时间,也许应用程序崩溃(不是每次)。

有人遇到过这个问题吗? 我应该尝试使我的导入脚本更高效吗? 是否存在一些关于使用 Core Data 导入数据的良好做法?

提前非常感谢!

【问题讨论】:

一些代码会有所帮助。 你是在主线程上运行所有这些吗? 我在第一次启动时创建并插入了大约 1000 个对象,这需要不到 2 秒的时间。但这在很大程度上取决于对象有多大以及您必须多久保存一次上下文。优化数据模型有很大帮助。使用具有许多关系的高度规范化的 DB 模型很可能在 ios 中表现非常糟糕。 是的,我正在主线程上运行导入,并且在导入结束时只保存一次上下文。 【参考方案1】:

我通常使用与 Gopal 相同的技术。除了文件大小之外,我遇到的唯一缺点是您在发送的数据中发现错误。如果发生这种情况并且您需要修复数据,则需要确定用户数据中是否存在不良数据并进行更新。我在启动时通过检查应用程序的 NSUserDefaults 中的 didUpdateToVersionX 值、查询用户数据存储以查找错误记录、更新相关对象、保存存储并设置首选项标志来处理此问题。

您的种子数据是用户可编辑的还是只读的?如果它是只读的,您应该能够拥有单独的只读和用户可写存储(前者在应用程序包中,后者在 Documents 目录中)。 Marcus Zarra 在回答另一个问题时发了nice writeup of this technique。根据您的设置,它可能涉及一些额外的工作。我想将上述应用程序切换到使用这种技术,但我一直没有机会。

【讨论】:

我的数据必须是只读的。该应用程序仅用于读取信息【参考方案2】:

我通常会在应用程序本身中捆绑包含初始数据的 sqlite 文件。在应用启动时,检查 db 文件是否存在,如果不存在,则将其从捆绑包复制到文档目录或任何位置。

以增加应用程序大小为代价加快启动时间。

【讨论】:

我认为这不是一个好策略。如果 Apple 更改其内部 Core Data SQLite 交换会怎样?您在商店中的应用会损坏,直到您注意到并获得更新。 Core Data 的目的不是直接在 SQLite 文件中操作数据。 Core Data 是一个 ORM,它在 SQLite 数据库和 Objective-C 中的对象之间做中介。 如果苹果对其 .sqlite 格式进行了不兼容的更改,每个人的应用程序都会崩溃。 Apple 不太可能这样做。 我想知道为什么投反对票?我从 iOS 4.3 开始使用这种方法,到目前为止没有问题。为了清楚起见,我不会手动创建“种子”sqlite 文件,它是由实际应用程序本身使用 coredata 创建的。一旦我存储了所需的“种子”数据,我就会压缩 sqlite 文件并将其与应用程序二进制文件捆绑在一起

以上是关于首次应用启动时导入核心数据的主要内容,如果未能解决你的问题,请参考以下文章

核心位置与 RestKit 结合

iPhone CoreData 应用程序首次启动崩溃

搜索核心数据与 Plist

核心数据+本地化

在swift ios中再次运行应用程序后核心数据显示故障记录?

需要 iCloud 时如何处理首次启动体验?