繁体   English   中英

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

[英]Core Data VS Sqlite or FMDB…?

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

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

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获得一些重要的生产力优势。

安德鲁

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

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

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


TL; DR:

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

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

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

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

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

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

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

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

在Core Data中,您需要在实际使用数据库之前输入一些“样板”代码。 您的应用至少需要以下其中一项:

  1. 持久性商店协调员
  2. 托管对象上下文
  3. 一个托管对象。 这与实体相关,如果您使用SQLite数据库,则该实体与表相关联。

要充分利用框架,您需要了解这些对象在数据管理中的作用。

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM