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

标签 c++ ios sqlite core-data icloud

我的任务是将个人面部识别软件移植到 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 文件。这极有可能损坏文件,因为 SQLite 在构建时并未考虑到这种用途。

但是:

  • 您可以将 SQLite 仅用于本地设备存储,并使用单独的 API 来回发送数据。如果您需要 iOS 8+,Apple 的 CloudKit 可能是一个不错的选择。存在许多第三方解决方案(例如,Parse)。您必须编写自己的代码来在 SQLite 和网络 API 之间进行转换。如果您使用 SQLite 的直接 API 而不是 Objective-C 包装器(我强烈建议使用 FMDBPLDatabase 如果您使用 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 可能更容易处理。

关于c++ - SQLite、iCloud,也许还有 Core Data——用于存储文件并与所有用户的设备共享它们?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25737985/

相关文章:

ios - 如何将 UITabBarController 和滑动菜单(如 MMDrawerController)组合起来制作 Storyboard?

java - 插入错误且未找到表

mysql - 使用 SQL 根据结果排序操作中的位置批量更新列?

sql - 选择表中所有条目的更新表

C++ 从列表中读取文件

c++ - C++结构的字段大小

c++ - boost::bind、boost::function 和 boost::factory 的问题

ios - 生成 NSDictionary 的深拷贝以修改嵌套值

ios - 如何在 child 区为 iOS 应用程序实现家长控制

c++ - 更正我的次优二进制搜索