SQLite,iCloud和核心数据 - 用于存储文件并与所有用户的设备共享?

时间:2014-09-09 06:32:02

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

有人可以推荐哪种方式最适合我的目的吗?提前谢谢。

Aaron Solomon Adelman

1 个答案:

答案 0 :(得分:2)

首先,您不想尝试直接共享SQLite文件。这极有可能破坏文件,因为SQLite并没有考虑到这种用途。

然而:

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

最好的方法取决于您的需求。如果您希望将数据文件从iOS应用程序复制到其他平台,那么SQLite就是好的。您仍然会拥有许多特定于平台的代码,因此节省的成本要少得多。如果您不打算像这样移动数据文件,Core Data可能更容易处理。