[英]Core Data vs. SQLite for SQL experienced developers
我们正在iPhone企业开发人员计划中开始开发内部应用程序。 由于它接近OS 3.0,因此我们重新考虑了使用SQLite和使用Core Data的原始设计。 这是更多信息:
我的问题是:与SQLite相比,Core Data的好处是什么?在这种特定情况下,好处是什么?这些好处是否足以证明学习新框架而不使用现有的强大SQL技能?
编辑:我只是注意到这个问题: 核心数据与SQLite 3 。 我想我的问题因此是:
在阅读Core Data与SQLite 3时 ,您知道Core Data和持久性机制(在这种情况下为SQLite)在很大程度上是正交的。 核心数据实际上是关于管理对象图的,其主要用例是MVC体系结构的模型组件。 如果您的应用程序很好地适合此体系结构,那么使用Core Data可能值得,因为它将在模型组件中节省大量代码。 如果您已经有一个有效的模型组件(例如,从现有的桌面应用程序中获取),那么Core Data不会给您带来很多好处。 可以使用混合方法-您可以执行自己的持久性/查询,并在内存存储中构建Core Data,并使用查询结果填充该数据,然后通过Core Data将此内存中存储用作应用程序的模型组件。 这并不常见,但是我已经做到了,并且没有主要障碍。
要回答您的特定问题:
您可以为整个持久性存储分配一个版本号,并通过+[NSPersistentStore metadataForPersistentStoreWithURL:error:]
检索该信息,甚至无需打开存储。 当然,也存在等效的+setMetadata:forPersistentStoreWithURL:error
。 如果要将版本信息存储在实体实例中,而不是存储在持久性存储元数据中,则只能加载单个对象。 有了SQLite永久存储,Core Data可以很好地完成仅获取所需内容的工作。
NSPredicate
API非常易于学习,似乎可以很好地编译成SQL。 至少对于您可以在iPhone上安装的大小的数据库而言,根据我的经验,这当然足够了(性能方面)。 我认为SQL vs. Core Data问题有点误导了。 一旦获得查询结果,您将如何处理它? 如果自己动手,则必须实例化对象,处理错误/唯一化(如果您不想立即将整个查询结果加载到内存中)以及Core已经提供的所有其他对象图管理功能数据。
听起来您已经使用SQLite设计了项目,并且您具有该领域的经验。
因此,最重要的是,移植该项目是否有意义,Core Data会给我带来我原始设计中没有的任何东西吗?
根据此项目的要求,假设原始设计正确完成,则可能不值得。
但是,讨论还没有结束。 还有其他事情要考虑:我的下一个项目对数据库的要求是否会如此低? 由于时间或预算限制,我是否需要尽快发货? 假设我迟早要学习核心数据,现在这样做是没有道理的吗? 我可能会对将代码移植到Mac感兴趣吗?
这些问题的答案可能会导致您做出以下决定:是的,值得一提的是回到图纸板上,并了解Core Data的全部含义。
最后一个问题:有什么优势? 好吧,Core Data是数据库的更高层次的抽象,它也是数据存储不可知的(因此,如果iPhone的未来版本放弃了SQLite以使用MySQL的嵌入式版本,这是不可能的,但这只是一个示例),那么Core数据几乎不需要更改代码就可以与新的数据存储一起使用。 Core Data将为Mac平台提供大量的快速可移植性。 核心数据将处理您的数据模型的版本控制,而除非您拥有管理它的框架或工作流,否则将无法直接访问SQLite。
我敢肯定,其他回答者也可以带来其他优势,也许是一些很好的理由,为什么不弄乱Core Data。 顺便说一句,在类似情况下,我的决定是移植到更高级别的新框架。 但就我而言,这是一个附带项目,并且发货日期和预算都不重要。
不会影响这个论坛,但是您可能会在Apple iPhone DevForum中找到更多具有上下文相关经验的受访者。
从纯粹的项目管理角度来讲,这听起来像您知道如何使用SQLite构建要构建的内容,所以对我来说,从这条路线开始比较有意义。
话虽这么说,CoreData建立在SQLite之上,并且如果您尝试将系统的其他部分与数据结合使用,例如使用KVC / KVO或绑定,那么您可能会很快发现此功能值得学习。
=迈克
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.