SQLite是否会优先于Core Data以获取时间范围等?

时间:2012-02-21 22:35:41

标签: objective-c ios sqlite core-data

我已阅读过Core Data和SQLite 3,但我不确定哪种方式最适合我。

我从API获取约会列表,然后需要存储它们。我需要根据日期范围,员工,客户等来引用它们。从我所读到的内容中,SQLite3最适合检索在某个时间范围内发生的约会以及分配给某些客户和员工的约会。

我读到核心数据是要走的路,但它似乎不能像我想要的那样发挥作用。有人可以根据我的需求解释一下这个问题,让我知道哪个最好吗?如果我使用SQLite3会使FMDB最好吗?

更新1:

关于核心数据的一个问题是,Appple似乎不喜欢将Core Data与多线程一起使用的应用程序。

2 个答案:

答案 0 :(得分:2)

在我看来,对于这种特殊情况,核心数据将是更好的选择,特别是在约会,客户和员工之间建立关系时。

核心数据不仅仅是一个数据库,它还是一个对象图管理系统。这意味着您可以通过在数据模型中将这些关系指定为一对一,一对多或多对多来轻松维护客户,员工和约会的关系,具体取决于适当的方式。为员工分配约会可以简单到将该分配的employee关系设置为适当的对象,或者将约会添加到员工内的appointments关系。获取这些约会就像抓住该员工关系中的对象一样简单,并且通过使用具有这些关系的匹配属性的自定义NSManagedObject子类,可以使此代码非常干净。

正如SteAp指出的那样,根据this question中的说明,很容易根据特定时间范围编写NSPredicates进行过滤。通过使用适当的选项,您可以在调试日志记录模式下运行应用程序,以查看响应这些谓词而生成的SQLite查询,并且它们通常是您为实现相同的提取而编写的。

在iOS上,Core Data几乎总是使用SQLite作为其后备数据存储,因此您会认为它会在此基础上引入大量开销。相反,它执行一些非常好的优化,例如批量提取,这可能导致Core Data在许多情况下优于原始SQLite。我在自己的应用程序中见证了这一点,特别是当你想要在表或类似结构中呈现的长结果列表时。有certain cases它会崩溃,但那些很少而且很远。

我在我的应用程序中完成了数据模型的原始SQLite和核心数据实现,并且在每种情况下,Core Data都大大减少了我需要编写的代码量。结合我见过的性能优势,我已经或将把所有基于SQLite的项目移动到Core Data。

即便是布伦特·西蒙斯(Brent Simmons),他写了一篇关于特定性能问题的上述链接文章,导致他在一个案例中远离核心数据,这就是这样说的:

  

我认为核心数据是95%的时间都是正确的方式。或者更多。它的   易于使用。它很快(在大多数情况下)。

然后他跟着more recent statement

  

对于那些掌握它的人来说,这可能会让人感到惊讶   我是那个不喜欢Core Data的人。所以我会说 - 最重要的是   使用核心数据的所有其他充分理由,这是另一个:核心数据   是标准的Cocoa对象持久性系统。

     

当它变得更好时,我们的应用会变得更好。 (而且它确实在继续   更好。)

     

而且,更重要的是,作为标准,它意味着任何Cocoa   开发者 - 团队成员或获得应用程序的人 - 可以加入进来   并快速了解它是如何工作的。

     

是的,您的自定义内容可能更适合您的应用。但它会留下来吗?   更好?如果你带人去帮助你,他们会多快   学习你的自定义东西?

     

使用核心数据。

答案 1 :(得分:0)

对于CoreData,我建议学习Apple tutorial

一般来说,我建议使用CoreData,因为它与Interface Builder很好地集成在一起。例如。使用绑定,你可以

  • 启用按钮
  • 显示或隐藏控件
  • 将下级NSTableView绑定到其父NSTableView(由阵列控制器)选择

因此,我强烈建议使用核心数据。

如果您的应用只管理一堆小商品,为什么不将它们放在用户默认数据库中。

如果您也想支持iCloud,CoreData也是您的最佳选择。请查看WWDC 2011 Session 315或查看本教程:iOS How-To : Using Core Data with iCloud

BTW,nib2objctranslate XIBs to functional equivalent ObjC code的一个不错的项目。