核心数据VS Sqlite或FMDB ....?

时间:2012-01-04 08:23:39

标签: iphone ios sqlite core-data fmdb

现在这可能看起来像一个重复的线程,但我的问题是我已经阅读了很多问题,例如...... Core Data vs SQLite 3和其他问题,但这些问题已经有2到3年了。我还读到FMDB是由于iOS上不支持核心数据而开发的,因此不应再使用它了。而另一方面,我已经读过,不应该将核心数据用作数据库。

所以我很困惑,我是否应该使用核心数据进行对象存储。我的意思是在什么基础上我应该决定使用哪个?苹果或其他人是否提供了任何指导方针..或者是时间会来找我的。?

6 个答案:

答案 0 :(得分:45)

ANKIT,

这是tl; dr skinny:使用核心数据。

这是长篇形式:

虽然您可以使用许多标准在Core Data,ORM(FMDB)或直接sqlite调用之间进行选择,但这种选择的实际成本来自您使用它的时间,Apple的支持以及其他项目的影响力。 (RESTKit,将REST服务映射到Core Data,现在很流行。)

因此,很大一部分时间,比如90 +%(一个编制的统计数据),iOS上的答案将是使用核心数据。为什么?一旦掌握了它并构建了一些小帮助方法,Core Data就会让您处于一致的计算世界 - Objective-C对象图。 Core Data将教您如何使用动态语言,这将有助于iOS编程的其他方面。因此,你的工作效率更高。不要与框架作斗争。

如果你带来一个庞大,复杂的SQLite数据库&来自另一个应用程序的架构,使用FMDB或SQLite可能具有成本效益。但我对此表示怀疑。您编写一个简单的基于Mac的命令行应用程序将数据库迁移到Core Data DB的时间是一项有限且简单的任务。您几乎可以保证必须重写Objective-C中的大多数业务逻辑。 (是的,C ++和Objective-C ++都是很好的技术。你的数据库业务逻辑是否真的被调整为在内存有限的设备上工作?我不这么认为。)

核心数据在性能方面受到抨击。这真的很快。您只需使用它而不是使用数据库。特别是,您几乎总是从存储中过度获取数据,然后使用直接在各种集合和数组上的谓词来优化它。在iOS设备上,闪存速度非常慢,这种过度获取策略特别有效。实际上,这些设备上有很多RAM,用它来获得性能。 (是的,我知道这与我上面对可移植业务逻辑的冲击明显矛盾。但实际上,从桌面或服务器环境移植的代码有很多关于磁盘速度,内存量和实际情况的隐含假设。一个带有后备存储的虚拟机,它只能在电池供电,内存受限的设备上运行良好的内存模型。[它在Android设备上也无法正常工作。])您还将对数据进行非规范化以简化在各种iOS和Mac OS X UI小部件中显示它。有一些应用程序,其中Core Data将比同等的SQLite DB慢。这些已在别处详述。一个主要的主张是上游数据库定义ID的任务达到核心数据的性能是真实的。但是,通过明智的索引和过度提取可以稍微减轻它。

关于移动设备要记住的事情是,数据库大小,因为这些是互联网叶子上的移动设备,通常是适度的大小。因此,性能更容易实现。来自服务器世界的许多经验教训可能不适用于这个移动电池供电的世界。

换句话说,你必须“全押”才能在iOS / Mac OS X上使用Objective-C,你也可以通过使用Core Data获得一些重要的生产力优势。

安德鲁

答案 1 :(得分:38)

我最近自己踏上了这个旅程,最终尝试了这三个。这是我学到的东西:

  • 原始sqlite3
    • 对数据库的低级,完全访问权限。没有抽象。非常冗长 - 需要大量代码才能完成非常简单的事情。
  • 核心数据
    • 非常高级,基于抽象,必须使用Apple生成的数据库。适用于iCloud同步和简单的iOS数据管理。直接访问数据库既困难又危险,不应该用于跨平台数据库。仍然需要相当数量的代码来做简单的事情。
  • FMDB
    • 高级,非常抽象友好但不强迫。如果需要,仍然可以完全访问数据库。提供结果的NSDictionary,每个项自动被类型化为正确数据类型的可变变体(例如,文本列返回为NSMutableString)。我最终围绕它构建了一个非常简单的包装类来进一步抽象它,所以我有一个带有静态函数的辅助类,如selectAllFrom:(NSString *)table where:(NSDictionary *)conditions,它返回NSArrayNSDictionary个对象。能够做NSArray *usersNamedJoe = [DBHelper selectAllFrom:@"user" where:@{@"name": @"Joe"}];
    • 之类的事情真是太棒了

基本上,虽然Core Data可能对简单的iOS应用程序很有用,但任何对使用跨平台数据库感兴趣的人都应该远离它 - 苹果公司没有兴趣让它变得那么简单,而且它显示出来。 / p>


TL; DR:

  • 除非你做的事情非常简单,否则不要使用原始的sqlite3。
  • 核心数据适用于简单的iOS数据,如果您对锁定它感到满意。
  • 如果你想完全控制数据库并且你没有做一些微不足道的工作,或者你正在为多个平台构建你的应用程序,那么FMDB绝对是你的选择。

答案 2 :(得分:8)

我使用FMDB用于所有大量使用“INSERT s”且FMDB未过期的项目。 Github的最后一次提交是去年11月。如果你使用SQL,我建议你使用FMDB。

核心数据适用于所有项目的95%,但是如果要进行优化以实现目标。如果您想要Core Data(OOP,...)的好处,那么请使用它。如果你有很多插入删除“WHERE”用户Sqlite(FMDB)

这个POST解释了Core Date与Sqlite(FMDB)的关闭和顶级网站

答案 3 :(得分:6)

CoreData 只是SQL数据库的抽象。 CoreData也可以进行对象图管理。 CoreData可以做FMDB根本无法做到的事情。

一如既往:这取决于您的使用案例。但在99%的情况下,CoreData是正确的选择。

如果性能至关重要,您仍然必须了解数据库的工作方式。但是,如果以正确的方式使用CoreData,CoreData可以提供该性能。但这需要一些时间来学习。在CoreData中有很多事情是微不足道的,在FMDB中要做的很复杂。

答案 4 :(得分:2)

作为一个新的SQL人,我要投入两分钱:

在核心数据中,你有一些"样板"在实际使用数据库之前需要输入的代码。您的应用至少需要其中一种:

  1. 持久性商店协调员
  2. 托管对象上下文
  3. 托管对象。这与实体相关,如果您使用SQLite数据库,则该实体与表相关联。
  4. 要充分利用框架,您需要了解这些对象在数据管理中扮演的角色。

    另一方面,我们有SQLite,在我看来,它更容易理解。首先,您需要:

    1. 数据库
    2. 一张或多张表(取决于您的数据)
    3. SQL知识 - 一种语言简单的灵活语言(SELECT查询比你原先认为的更多)
    4. 您的应用与SQLite通信的对象。

答案 5 :(得分:0)

核心数据只是SQLite3数据库的对象抽象化。这意味着您可以轻松管理标准数据库操作的持久对象。您还可以在事务模式下工作,并通过创建模型在XCode中设计核心数据数据库结构。

如果您不想手动创建SQLite3数据库或持久性方法,请使用Core Data。