代码之家  ›  专栏  ›  技术社区  ›  Coocoo4Cocoa

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

  •  2
  • Coocoo4Cocoa  · 技术社区  · 16 年前

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

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

    此外,随着核心数据在您的应用程序中的结合,是否有任何理由仍然使用sqlite3?您是否仍将其用于提供离线内容、保留不一定有意义的统计信息以创建模型?或者,是否也有办法将所有这些信息合并到核心数据中?

    2 回复  |  直到 16 年前
        1
  •  2
  •   groundhog    16 年前

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

    • 保持参照完整性
    • 架构更改时的托管模型迁移
    • 提供对象关系映射
    • 大大简化了插入、连接和查询过程——例如,连接通常只通过“点式”语法完成。
    • 多个存储重叠(尽管查找有关此问题的stackoverflow问题以查看它是否在sqllite上有效,但仍在等待响应…)
    • 结构化谓词构造-可以将谓词创建为对象,而不是内联嵌入的SQL语句
    • 反射式数据存储—您可以在运行时以结构化和静态分析的方式对数据存储进行自省。

    这就是说,如果你的应用程序已经被设计成与一个sqllite数据库兼容,你真的需要问问自己是否准备好转换你的应用程序了。

    你至少需要做这些事情:

    • 在核心数据管理对象模型中重新构建整个数据库模式
    • 重写所有数据库查询和管理以使用核心数据
    • 重写所有模型,使其要么由核心数据生成的托管对象支持,要么扩展它们。
    • 手动将所有现有数据导入核心数据数据库
    • 准备好编写更多的代码!尽管核心数据为处理数据存储查询和管理提供了一个良好的对象框架,但它也以牺牲冗长性为代价。
    • 为了继续上一点,当您对模式进行相对较小的更改时,您将准备花费相当长的时间来提供模式映射,并将其正确地应用到现有的模式中。

    如果您已经解决了几乎所有这些问题,那么从将现有应用程序移植到核心数据中获得的好处就是优雅并跟上最新技术的发展。为了达到这个目标,你必须付出不小的努力,而且考虑到这些好处可能并不惊人,你可能会发现它不值得你花一段时间。

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

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

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

        2
  •  0
  •   Kendall Helmstetter Gelner    16 年前

    另一个答案很好,但我不同意主要是优雅和跟上技术的好处…移动到核心数据的真正原因实际上是与性能和内存相关的,核心数据非常智能地管理缓存,您需要做很多工作来复制它。对我来说,这是考虑它的唯一原因,因为如前所述,它非常冗长,而且您还必须处理所有需要使用nsnumber来保存基元值的数据对象(我觉得这特别烦人)。

    对于类似于您的设置的东西,我可能会采用的迁移方法是让每个模型类都保存在实际上是存储类的托管对象上—这样您的整个代码就不必更改,只需要模型对象中的一些内容,以及可能为处理创建或填充模型对象。这甚至隐藏了nsnumber包装的原语问题。

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

    http://www.pragprog.com/titles/mzcd/core-data

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