iphone - 核心数据 VS Sqlite 或 FMDB……?

标签 iphone ios sqlite core-data fmdb

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

所以我很困惑,我是否应该将核心数据用于对象存储。我的意思是我应该根据什么决定使用哪个? Apple 或其他人是否提供了任何指导方针......或者它会随着时间的推移而出现。?

最佳答案

安 git ,

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

这是完整的形式:

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

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

如果您要从另一个应用程序引入一个大型、复杂的 SQLite 数据库和架构,那么使用 FMDB 或 SQLite 可能具有成本效益。但我对此表示怀疑。您编写一个简单的基于 Mac 的命令行应用程序以将数据库迁移到核心数据数据库的时间是一项有限且简单的任务。您几乎可以肯定必须重写 Objective-C 中的大部分业务逻辑。 (是的,C++ 和 Objective-C++ 都是很好的技术。您的数据库业务逻辑是否真的经过调整以在内存有限的设备上工作?我不这么认为。)

Core Data 在性能方面名声不佳。它真的很快。您只需要以不同于使用数据库的方式使用它。特别是,您几乎总是从存储中过度获取数据,然后直接在各种集合和数组上使用谓词对其进行优化。在闪存出奇地慢的 iOS 设备上,这种过度获取策略特别有效。您实际上在这些设备上有很多 RAM,用它来提高性能。 (是的,我知道这与我上面的可移植业务逻辑明显矛盾。但实际上,从桌面或服务器环境移植的代码有很多关于磁盘速度、内存量和实际情况的隐含假设。具有后备存储的 VM,它在电池供电、内存有限且内存模型古怪的设备上无法正常工作。[它在 Android 设备上也不会很好地工作。])您还将对数据进行非规范化以简化在各种 iOS 和 Mac OS X UI 小部件中显示它。在一些应用程序中,Core Data 会比等效的 SQLite 数据库慢。这些在其他地方有详细说明。一个主要的说法是,ID 由上游数据库定义的任务会影响 Core Data 的性能是真实的。但它可以通过明智的索引和过度获取在某种程度上得到缓解。

关于移动设备也需要记住的一点是数据库大小,因为这些是互联网上的移动设备,通常大小适中。因此,性能更容易获得。服务器世界的许多经验教训可能不适用于这个移动的、电池供电的世界。

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

安德鲁

关于iphone - 核心数据 VS Sqlite 或 FMDB……?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8723923/

相关文章:

ios - Realm.io 可选属性

ruby-on-rails - 在 SQlite3 和 PostgreSQL 中使用模型方法

mysql - 安装 MySQL 驱动程序后,Perl SQLite 驱动程序停止工作

ios - 将 CATiledLayer 内容捕获到另一个图层或图像上下文

Objective-C:将两个整数相除并返回一个四舍五入的整数值

ios8 隐藏/显示导航栏和工具栏

ios - 使用 OpenCV 图像识别为 Objective-C 自定义视频摄像头应用程序添加亮度/ Gamma 控制

perl - 如何使用 SQLite 使 DBIx::Class 在 ORDER BY 中忽略大小写?

iphone - 当 iPhone 应用程序后台不工作时是否可以获取位置

iphone - dismissviewcontrolleranimated completion 不在 uiimagepickercontroller 上调用完成