使用核心数据将iPhone 2.x应用程序转换为3.0的提示

使用核心数据将iPhone 2.x应用程序转换为3.0的提示,iphone,objective-c,cocoa-touch,core-data,Iphone,Objective C,Cocoa Touch,Core Data,我有一个为iPhone OS 2.x开发的应用程序。出于显而易见的原因,该应用程序中的模型类是在没有核心数据的情况下编写的 既然3.x已经可用,我想知道我可以选择哪些选项来获取现有的模型类并用核心数据重建它们。除了显而易见的功能外,我还用我的模型做很多事情,比如序列化它们并将它们存储到sqlite3数据库中,这样我的应用程序就可以在没有任何网络连接的情况下工作。我希望核心数据也能帮助我做到这一点 另外,随着核心数据在应用程序中的合并,还有什么理由仍然使用sqlite3吗?您是否仍会将其用于提供脱

我有一个为iPhone OS 2.x开发的应用程序。出于显而易见的原因,该应用程序中的模型类是在没有核心数据的情况下编写的

既然3.x已经可用,我想知道我可以选择哪些选项来获取现有的模型类并用核心数据重建它们。除了显而易见的功能外,我还用我的模型做很多事情,比如序列化它们并将它们存储到sqlite3数据库中,这样我的应用程序就可以在没有任何网络连接的情况下工作。我希望核心数据也能帮助我做到这一点


另外,随着核心数据在应用程序中的合并,还有什么理由仍然使用sqlite3吗?您是否仍会将其用于提供脱机内容、保留可能不一定有意义的统计信息来创建模型等用途?或者有没有办法将所有这些都整合到核心数据中?

我发现在iPhone应用程序中使用核心数据的主要好处是:

  • 保持引用完整性
  • 基于模式更改的托管模型迁移
  • 提供对象关系映射
  • 大大简化了插入、连接和查询过程——例如,连接通常是通过“虚线”语法完成的
  • 多存储覆盖(尽管寻找我的stackoverflow问题,看看它是否在sqllite上实际工作,仍在等待响应…)
  • 结构化谓词构造—您可以将谓词创建为对象,而不是内嵌的sql语句
  • 反射数据存储—您可以在运行时以结构化和静态分析的方式对数据存储进行内省
这就是说,如果你的应用程序已经设计成可以在sqllite数据库上运行,那么你真的需要问问自己,你是否已经准备好将你的应用程序转换为SQL

您至少需要做以下几件事:

  • 在核心数据管理对象模型中重新构建整个数据库模式
  • 重写所有数据库查询和管理以使用核心数据
  • 重写所有模型,使其由核心数据生成的托管对象支持,或扩展它们
  • 手动将所有现有数据导入核心数据数据库
  • 为可能编写更多代码做好准备!尽管核心数据为处理数据存储查询和管理提供了一个良好的对象框架,但它也以冗长为代价
  • 要继续上一点,当您对模式进行相对较小的更改时,您将准备花费相对大量的时间提供模式映射并将其正确应用于现有模式
如果您已经解决了几乎所有这些问题,那么将现有应用程序移植到核心数据将带来的好处是优雅和跟上最新技术。你必须付出不小的努力才能做到这一点,而且考虑到好处可能并不巨大,你可能会发现这真的不值得

为了回答您的第二个问题,老实说,如果您使用的是核心数据,我真的想不出任何直接使用sqllite的理由。例如,我不确定核心数据中的外部连接是否非常简单。然而,您通常不会以这种方式使用核心数据——您会在程序上使用它来制作与SQL中的外部联接相同的效果

对于统计数据和其他东西,我仍然会使用核心数据,因为它提供了一些奇妙的聚合功能


请注意,没有什么可以阻止您采取相反的方法:采用核心数据进行扩展功能,直到您对其感到足够满意,然后开始移植您的主要应用程序现有代码以使用核心数据。

另一个答案很好,但我不同意主要是优雅和跟上技术的好处。。。转移到核心数据的真正原因实际上是性能和内存相关,在核心数据中,缓存管理非常智能,您需要做大量工作才能复制。这对我来说是唯一考虑它的唯一原因,因为它是非常冗长的,而且你还必须处理所有需要使用NSCONT来保存原始值的数据对象(我特别讨厌)。 对于类似于您的设置,我可能会采取的迁移方法是让每个模型类保留实际上是存储类的托管对象,这样您的整个代码就不必更改,只是模型对象中的一些内容,以及您为处理模型对象的创建或填充而可能构建的管理类。这甚至隐藏了NSNumber包装的原始问题

如果您正在强烈考虑使用核心数据,您可能想看看这本书,它也涵盖了iPhone特定的核心数据(包括NSFetchedResultsController):

你可以买一个电子书只解锁PDF版本,这不是太贵