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