我正准备潜入我的第一次Core Data冒险之旅。在评估框架时,出现了两个问题,这让我开始考虑在这个项目中使用Core Data或者坚持使用SQLite。
我的应用程序将严重依赖从外部源导入数据。我知道可以导入Core Data但处理复杂的关系似乎很复杂和乏味。有没有简单的方法来完成复杂的进口?
应用程序必须能够执行跨多个表或具有多个条件的复杂查询。构建这些谓词和表达式只会吓到我......
是否值得冒险尝试使用Core Data,还是应该坚持使用SQLite?
答案 0 :(得分:3)
正如I和others之前所说,Core Data实际上是一个对象图管理框架。它管理模型对象之间的关系,包括对其基数的约束,并管理级联删除等。它还管理对各个属性的约束。核心数据只是发生,也能够将该对象图持久化到磁盘。它可以通过多种格式执行此操作,包括XML,二进制和SQLite。因此,Core Data实际上与SQLite正交。如果您的任务是处理嵌入式SQL兼容的数据库,请使用SQLite。如果您的任务是管理MVC应用程序的模型层,请使用Core Data。在您的问题的具体答案:
没有任何魔法可以自动将复杂数据导入任何模型。也就是说,核心数据相对容易。使用multi-pass approach并使用SQLite后端可以通过允许您一次只在内存中保留一部分数据来帮助消耗内存。如果数据集可以保存在内存中,您可以编写自定义持久存储格式,从Core Data中直接读取/写入旧数据格式(请参阅Atomic Store Programming Guide)。
以声明方式构建复杂NSPredicate
有点冗长,但不应该吓到你。 Predicate Programming Guide是一个很好的起点。当然,您也可以使用字符串格式编写谓词,就像字符串格式的SQL语句一样。值得注意的是,如上所述,Core Data中的谓词位于对象和对象图上,而不是SQL表上。如果确实想要在表级别思考,请坚持使用SQLite并编写自己的包装器。
答案 1 :(得分:1)
我真的不能说到你的第一点。
然而,关于你的第二点,使用核心数据意味着你不必真正担心复杂的查询,因为你可以假装已经在内存中正确建立了所有关系(除了Apple的实现细节)。它在数据库环境中的连接有多复杂并不重要,因为您实际上并不在数据库环境中。如果您需要获取当前对象的祖父母的第四个孩子,然后找到该孩子的宠物的名字和品种,您所做的只是使用一系列消息或属性在代码中遍历对象树。不用担心加入或任何事情。唯一的问题是它可能真的很慢,取决于你的对象的关系,但我真的不能准确地说,因为我实际上没有使用核心数据实现任何东西(我刚刚在Apple和其他人上阅读过它'网站)。
答案 2 :(得分:0)
如果来自外部源的数据导入器是基于相同的核心数据模型编写的(对于导入的目标/目标端) - 与使用/更新相同数据(通过核心)相比,概念上不会有什么不同来自实际应用程序的数据堆栈。)
如果在不使用核心数据堆栈的情况下创建数据导入器,请确保您熟悉基于核心数据的模型生成/预期的db模式。那里没有什么神奇之处 - 只需确保遵循如何实现跨实体关系以及如何存储实体层次结构。
我不得不最近将Access数据库中的数据导入器创建为基于核心数据的Sqlite存储作为.NET应用程序。一旦我的目标核心数据模型被定义,我创建了一个小应用程序,用随机生成的实体(包括所有预期的关系)填充Sqlite存储。然后,我反向设计了核心数据如何实际为模型创建Sqlite存储,以及如何通过学习生成和持久数据来处理关系。然后,我根据我的观察实现了基于.NET的导入器/数据转换器。最后,我获得了完美的核心数据友好数据存储,可以从在Mac OSX上使用核心数据堆栈的应用程序进行修改。