iOS 中的数据模型持久性注意事项

Posted

技术标签:

【中文标题】iOS 中的数据模型持久性注意事项【英文标题】:Data model persistence considerations in iOS 【发布时间】:2013-05-16 14:06:04 【问题描述】:

我一直在我的 ios 应用程序中使用 sqlite 数据库来实现数据持久性,现在我正在尝试决定是否值得学习 Core Data。我一直在阅读一些关于其优缺点的文档和帖子,但我发现决定何时使用 Core Data 或 Sqlite 并不是很清楚(例如,Core Data VS Sqlite or FMDB…?)。

我需要一些指导来了解我是否应该学习和使用 Core Data,或者使用 Sqlite 对我来说就足够了:

    已经有了 sqlite 脚本,是否可以从 sqlite 数据库中的数据构建 Core Data 模型? Afaik,(如果我错了,请纠正我)您可以使用 sqlite 来持久化 Core Data 对象,但是可以反向操作吗? Core Data 是否适合处理多个用户数据?我需要考虑到不同的用户可以在同一设备上登录应用。

提前致谢

【问题讨论】:

我有两个主要的产品,一个使用Core Data,另一个使用FMDB。我非常喜欢使用 FMDB。核心数据的东西看起来很神秘,而且不直截了当,与它一起工作对我来说真的很痛苦。与简单查询相反,使用谓词也很痛苦。 FMDB 可以正常工作,而且很愉快。它还可以处理多人登录。 【参考方案1】:

Core Data 是一个很棒的框架,但是虽然它通常在幕后使用 SQLite,但您不应该将 Core Data 视为数据库引擎,而更像是一个对象持久性框架。如果您有大量 SQL 代码(尤其是批量更新等),则可能不值得转换为 Core Data。但 Core Data 有很多出色的性能优化、iCloud 集成等,因此值得更详细地研究。

如果您想了解 Core Data 的背景知识,我建议您观看 Apple 视频 Working with Core Data。

如果您只想简化 SQLite 代码,请查看FMDB。


回答您的问题:

已经有了 sqlite 脚本,是否可以从 sqlite 数据库中的数据构建 Core Data 模型? Afaik,(如果我错了,请纠正我)您可以使用 sqlite 来持久化 Core Data 对象,但是可以反向操作吗?

您通常必须重新定义您的核心数据模型。它不能只打开您现有的 SQLite 数据库(尽管一旦定义了模型,您就可以编写代码将数据从 SQLite 传输到 Core Data)。

Core Data 是否适合处理多个用户数据?我需要考虑到不同的用户可以在同一设备上登录应用程序。

是的,你可以。不过,您必须定义模型以手动处理此问题(例如,添加用户标识符字段并相应地手动编码谓词/过滤器结果,就像您在 SQLite 中必须做的那样)。

【讨论】:

【参考方案2】:

应用开发,

只有你可以判断是使用Core Data还是坚持使用SQLite。正如您在上面引用我的回答,您知道我的观点——使用 Core Data。让我把它放在你的上下文中。

最大的胜利是 Core Data 附带的抽象系列以及它们如何映射到 Objective-C 对象模型。这是您必须从 SQLite 应用程序手动处理的事情。 (你能做到吗?是的。不过,你很可能会创建一个针对你的 SQL 模式进行调整的自定义界面。它几乎没有可重用性。这是一个长期的问题。)

关于谓词与 SQL 查询的问题,这是世界观的不同。也就是说,由于谓词可以应用于 NSSet 和 NSArray,它们具有超出 Core Data 所需的实用程序。知道如何使用谓词将是有价值的。例如,您可以轻松地执行查询以获取记录集合,然后使用谓词过滤它们,例如搜索表视图。

每个人都需要在准备好接受特定模式时做出选择。毫不奇怪,SQL 专家喜欢坚持他们所知道的。动态语言爱好者会有不同的选择。对于 iOS/OS X,采用动态语言路径对开发人员来说将具有越来越大的价值。

因此,我的建议仍然是:使用 Core Data。

安德鲁

【讨论】:

以上是关于iOS 中的数据模型持久性注意事项的主要内容,如果未能解决你的问题,请参考以下文章

数据持久化

具有单个持久存储协调器的多个数据模型

NSPersistentStoreCoordinator 在 ios iOS 中没有持久存储(架构不匹配或迁移失败)核心数据

MyBatis

MyBatis

外部库数据模型的 JPA 持久性