我正在创建一个应用程序,该应用程序要求通过OData Web服务公开其数据的“脱机”持久性。 OData服务使我可以访问基础数据库的所有表以及所有相关数据库字段(例如ID)。

此外,我已经有了一个可以使用的SQLite数据库架构。

我的问题(已经对此进行了两次翻转)是通过SQLite(使用FMDB)直接通过SQLite将Web服务数据存储在设备上还是利用Core Data更好?

如果我使用Core Data,那么我将失去主键和外键的关系优势,但会获得自动嵌套/填充的NSManagedObjects的优势。我不确定如何最好地重新创建数据对象的关系性质。

如果使用SQLite,则可以直接插入/更新Web服务调用的结果,并自动从现有外键列获取关系。缺点是我可能需要将结果手动封装在POCO对象中。

我的直觉告诉我SQLite,但在任何情况下,社区似乎绝大多数都指向Core Data。如果是核心数据,我如何才能最好地创建和维护对象关系(尤其是当它们是“1->很多”时)

如果有任何令Apple满意的问题,则此应用不会进入应用商店。

最佳答案

核心数据直接建立关系模型。因此,在您的模式中,您可能会说该对象A与对象B有关系,并且该关系是“很多”的。但是,这些关系的工作方式就像普通对象引用一样-您需要将A的每个实例链接到B的所有相关实例,您不能[轻松地或通常地]只是说“A通过外键bID与B关联”,然后让关系处理自己。

如果您有一个SQL持久存储,则实现的方法是每个对象为其表获取一个隐式唯一键。关系被建模为一个额外的列,其中包含外部表中每个链接对象的一个​​或多个键。

人们倾向于不喜欢核心数据的其他方面:

  • 如果您始终依赖于隐式数据获取,那么您通常会获得较差的性能,因此无论如何您经常最终都会遇到显式查询,以填充可能要在单个数据库行程中查看的结果。
  • ,因为SQLite不是线程安全的,并且Core Data对象保持与其存储的实时连接,所以Core Data对象也不是线程安全的(尽管对其的objectID引用是线程安全的,并且您可以根据需要获取类似的安全字典,而不是实时对象);
  • 即使您以其他方式解决了线程问题,也仍然按照SQLite线程安全注释在后台保存仍然阻止对前台的访问。

  • 反过来:

    从iOS 5开始使用
  • ,您可以使用NSIncrementalStore,这样您就可以运行Core Data查询,并且Core Data存储足够聪明,可以在需要时访问服务器-代码主体不知道数据是本地还是远程并且在声明要查找的内容时无需重复进行操作;
  • 您可以免费获得实时数据库连接,因此,如果持久性存储发生更改,则对象会自动更新。
  • 如果您主要是要查看iPhone风格的表格视图,那么工作几乎已经全部完成,您只需提供查询即可;
  • Core Data具有完善的故障系统,可以在处理大型数据集时很大程度上解决内存占用问题。
  • 10-08 07:23
    查看更多