【问题标题】:Tips for converting an iPhone 2.x app to 3.0 with Core Data使用 Core Data 将 iPhone 2.x 应用程序转换为 3.0 的提示
【发布时间】:2009-08-02 18:16:09
【问题描述】:
我有一个为 iPhone OS 2.x 开发的应用程序。由于显而易见的原因,该应用程序中的模型类是在没有 Core Data 的情况下编写的。
现在 3.x 已经可用,我想知道我有哪些选择可以使用我现有的模型类并使用 Core Data 重建它们。除了显而易见的之外,我对我的模型做了很多事情,例如序列化它们并将它们存储到 sqlite3 数据库中,以便我的应用程序可以在没有任何网络连接的情况下工作。我希望 Core Data 也能在这方面为我提供帮助。
此外,在您的应用程序中加入 Core Data 后,还有什么理由继续使用 sqlite3?您还会将它用于提供离线内容、保留可能不一定有意义的用于创建模型的统计数据之类的事情吗?或者有没有办法将所有这些都整合到 Core Data 中?
【问题讨论】:
标签:
iphone
objective-c
cocoa-touch
core-data
【解决方案1】:
我发现在 iPhone 应用程序中使用 Core Data 的主要好处是:
- 保持参照完整性
- 架构更改时的托管模型迁移
- 提供对象关系映射
- 大大简化了插入、连接和查询过程 - 例如连接通常只通过“点”语法完成
- 多个商店覆盖(尽管查找我关于此的 stackoverflow 问题以查看它是否真的适用于 sqllite,仍在等待响应...)
- 结构化谓词构造 - 您可以将谓词创建为对象,而不是内联嵌入式 sql 语句
- 反射式数据存储 - 您可以在运行时以结构化和静态可分析的方式内省数据存储
也就是说,如果您的应用程序已经设计为针对 sqllite 数据库工作,那么您真的需要问自己是否准备好转换您的应用程序。
您至少需要做以下事情:
- 在 Core Data 托管对象模型中重塑整个数据库架构
- 重写所有数据库查询和管理以使用 Core Data
- 重写所有模型以由 Core Data 生成的托管对象支持或扩展它们
- 手动将所有现有数据导入您的 Core Data 数据库
- 为可能编写更多代码做好准备!尽管 Core Data 提供了一个很好的对象框架来处理数据存储查询和管理,但它也以冗长为代价。
- 继续前一点,当您对架构进行相对较小的更改时,您将准备花费相对大量的时间来提供架构映射并将其正确应用于现有架构。李>
假设您已经解决了几乎所有这些问题,那么将现有应用程序移植到 Core Data 所获得的好处是优雅并与最新技术保持同步。您将不得不付出相当大的努力来获得它,并且考虑到好处可能并不惊人,您可能会发现它真的不值得花时间。
为了回答您的第二个问题,如果您使用 Core Data 说实话,我真的想不出任何直接使用 sqllite 的理由。例如,我不确定外部连接在 Core Data 中是否非常简单。但是,您通常不会以这种方式使用 Core Data - 您会在程序上使用它来制作与 SQL 中的外连接相同的效果。
对于统计数据和其他东西,我仍然会使用 Core Data,因为它提供了一些很棒的聚合功能。
请注意,没有什么可以阻止您采取相反的方法:采用 Core Data 来扩展功能,直到您对它足够熟悉,然后开始移植您的主要应用程序现有代码以使用 Core Data。
【解决方案2】:
另一个答案非常好,但我不同意主要是优雅和跟上技术的好处......迁移到 Core Data 的真正原因实际上是性能和内存相关,在 Core Data 中非常智能地管理缓存你必须做很多工作才能复制它。对我来说,这是考虑它的唯一原因,因为它非常冗长,并且您还必须解决所有需要使用 NSNumber 来保存原始值的数据对象(我觉得这特别烦人)。
对于您的设置,我可能采用的迁移方法是让每个模型类保留实际上是存储类的托管对象 - 然后您的整个代码不必更改,只需更改您可能已经构建的模型对象和可能的管理类来处理模型对象的创建或填充。这甚至隐藏了 NSNumber 包装的原始问题。
如果您强烈考虑使用 Core Data,您可能想看看这本书,它也涵盖了 iPhone 特定的 Core Data(包括 NSFetchedResultsController):
http://www.pragprog.com/titles/mzcd/core-data
你可以买一本只有电子书的无锁PDF版本,价格也不贵...