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

Ank*_*ava 36 sqlite iphone core-data fmdb ios

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

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

ado*_*oho 45

ANKIT,

这是tl; dr skinny:使用Core Data.

这是长形式:

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

因此,很大一部分时间,比如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获得一些重要的生产力优势.

安德鲁

  • 作为Jeff LaMarche的SQLite持久对象的当前维护者,我补充说FMDB是正确使用的SQLite包装器.仅仅因为它最近没有更新并不是放弃的标志,而是成熟的标志.例如,我维护了Apple的Reachability代码版本,<http://blog.ddg.com/?p=24>.我有一段时间没有做过更新.(正在进行更新.)为什么?它运作良好.旧的稳定代码是一件好事.安德鲁 (5认同)

ale*_*bb2 38

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

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

基本上,虽然核心数据可能对简单的iOS应用程序很有用,但任何对使用跨平台数据库感兴趣的人都应该远离它 - 苹果公司没有兴趣让它变得那么简单,而且它表明了这一点.


TL; DR:

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


Car*_*rlJ 8

我将FMDB用于所有大量使用" INSERTs"的项目,FMDB并没有过时.Github的最后一次提交是去年11月.如果你使用SQL,我建议你使用FMDB.

核心数据适用于所有项目的95%,但如果涉及优化以运行到墙上.如果您想要Core Data(OOP,...)的好处,那么请使用它.如果你有很多插入删除与" WHERE"用户Sqlite(FMDB)

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

  • 简单地说:它更容易使用!并且你不自己处理sqlite"锁定"状态,它的线程保存,模式匹配,你可以使用普通的基础对象,你的代码更清晰.(FMDB)6行代码与使用sqlite的10 ++代码行 (2认同)

Dan*_*ert 6

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

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

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