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