SQLite、iCloud,也许还有 Core Data——用于存储文件并与所有用户的设备共享它们?

Posted

技术标签:

【中文标题】SQLite、iCloud,也许还有 Core Data——用于存储文件并与所有用户的设备共享它们?【英文标题】:SQLite, iCloud, and maybe Core Data—which to use for storing files and sharing them with all of the user's devices? 【发布时间】:2014-09-09 06:32:01 【问题描述】:

我的任务是将个人面部识别软件移植到 ios 和 Mac OS X,并帮助保持基本 SDK 和大部分软​​件尽可能跨平台。我的一位同事和我想做的一件事是将用户脸上的数据存储在 SQL 数据库(可能是 SQLite)中。我们还希望允许用户将他们的数据放在 iCloud 上,这样他们就不必分别训练他们的每台设备来识别它们。困扰我的是如何完成这两项任务,而且我面临着足够多的选择,让我感到不知所措。 (我对所涉及的一些技术还很陌生。)

为了实现 SQL,我可以将 SQLite 直接嵌入到我的程序中并为其编写代码,或者我可以使用 Core Data 并让它为我与 SQLite 对话。 (数据库不是要共享的,所以这没关系。而且 SQL 并不好玩。)然而,Core Data 绝不是可移植的(更不用说不用于编码为 C++ 对象的模型),而直接为 SQL 编写会意味着我们可以在其他平台上重用更多代码。

考虑到 iCloud,事情变得更加混乱,它有五六种可能的方式将其与程序集成。到目前为止,我明确排除的唯一方法是 iCloud 键值存储。 (至少,用户很有可能会遇到 1 MB 限制的问题,而且它显然不适用于我正在处理的任何复杂的事情。)Core Data 可以通过 UIManagedDocument 或 NSPersistentStore 与 iCloud 集成,但是,同样,这意味着可重用代码的方式更少。我可以将 SQLite 与 UIDocument 或 NSDocument 一起使用,但我想要做的似乎并不是这些对象的用途。我正在处理的文件本质上是大型首选项文件,并不意味着最终用户可以直接与之交互; UIDocument 和 NSDocument 似乎适用于用户可查看和可编辑的文件。然后是 iCloud Drive 和 CloudKit,它们仍处于测试阶段。 (另一方面,这两个将很快发布。考虑到 iOS 用户倾向于快速升级到最新版本的系统软件,关于使用其中任何一个的争论取决于他们将能够运行多少设备on 应该很快就会变得虚弱和过时。)

谁能推荐哪种方式最适合我的目的?提前致谢。

亚伦·所罗门·阿德尔曼

【问题讨论】:

使用核心数据作为后端存储相当sqlite。并且 iCloud 内置了对核心数据的支持 当您从其他非苹果平台制作端口时,您可能还想与它们同步数据,因此您应该寻找跨平台同步解决方案 - 因此 iCloud 和 CloudKit 不适合您。跨度> 【参考方案1】:

首先,您不想尝试直接共享 SQLite 文件。这极有可能损坏文件,因为 SQLite 在构建时并未考虑到这种用途。

但是:

您可以仅将 SQLite 用于本地设备存储,并使用单独的 API 来回发送数据。如果您需要 iOS 8+,Apple 的 CloudKit 可能是一个不错的选择。存在许多第三方解决方案(例如,Parse)。您必须编写自己的代码在 SQLite 和网络 API 之间进行转换。您的 SQLite 架构和数据文件可以移植到其他平台,如果您使用 SQLite 的直接 API 而不是 Objective-C 包装器,也许一些代码(我强烈建议使用 FMDB或PLDatabase 如果您使用 SQLite)。 Core Data 确实内置了对 iCloud 的支持,这可能使它成为一个可行的选择。您的评论 “...我可以使用 Core Data 并让它与 SQLite 对话。” 表明您可能对 Core Data 有一些误解。 Core Data 不是 SQLite 包装器;它提供了一个完全不同的 API,并使用自己的模式。除非您想花一些时间对架构进行逆向工程,否则您无法真正获取 Core Data 持久存储文件并在其他平台上使用它。此外,将 Core Data 与 iCloud 一起使用不需要使用 UIManagedDocument,尽管它仍然需要许多其他特定于 Core Data 的类。 如果您希望能够跨多个设备同步数据并非所有 Apple 设备,那么您需要第三方 API。 Apple 的云 API 在这里都没有用处。有许多提供者可以帮助解决这个问题。对于本地数据存储,SQLite 或 Core Data 都可以,但您应该查看第三方服务并查看它们支持哪些存储选项,然后尝试使用它们。

最佳方法取决于您的需求。如果您希望将数据文件从 iOS 应用程序复制到其他平台,SQLite 是不错的选择。你仍然会有很多特定于平台的代码,节省的钱要少得多。如果你不打算像那样移动数据文件,Core Data 可能更容易处理。

【讨论】:

以上是关于SQLite、iCloud,也许还有 Core Data——用于存储文件并与所有用户的设备共享它们?的主要内容,如果未能解决你的问题,请参考以下文章

在 icloud 中存储 sqlite 数据库?

如何将 sqlite 数据库与 Core Data 同步?

Swift - 向 Core Data 添加启用 iCloud 的持久存储

将 Sqlite 数据库与 iCloud 同步?

将 sqlite 数据库与 iCloud 同步

带有 iOS 和 iCloud 的 SQLITE 数据库