2009-05-20 66 views
2

我准备好深入我的第一个核心数据冒险。在对框架进行评估时,出现了两个问题,真的让我想到了在这个项目中使用Core Data或者坚持使用SQLite。对核心数据的担忧

  1. 我的应用程序将严重依赖于从外部来源导入数据。我意识到可以导入到Core Data中,但处理复杂的关系看起来很复杂和乏味。有没有简单的方法来完成复杂的进口?

  2. 该应用程序必须能够执行跨多个表或具有多个条件的复杂查询。建立这些谓词和表达式只会让我感到恐慌......

是否值得冒险和使用Core Data或者我应该坚持使用SQLite?

+0

我知道这个问题有点老,但你是如何解决你的第一点的?我有一个非常相似的场景,听到你的解决方案会很高兴。谢谢。 – 2012-08-23 17:32:08

回答

3

由于Iothers之前已经说过,Core Data实际上是一个对象图管理框架。它管理模型对象之间的关系,包括基数约束和管理级联删除等。它还管理对各个属性的约束。核心数据只是发生也能够将该对象图持久化到磁盘。它可以通过多种格式来完成,包括XML,二进制和SQLite。因此,核心数据实际上与SQLite正交。如果您的任务正在处理嵌入式SQL兼容数据库,请使用SQLite。如果您的任务正在管理MVC应用程序的模型层,请使用Core Data。在具体问题的答案:

  1. 有没有神奇的,可以复杂的数据自动导入到任何模型。也就是说,这在Core Data中相对容易。采取multi-passapproach并且使用SQLite后端可以帮助您节省内存,因为您一次只能保留内存中的一部分数据。如果数据集可以保存在内存中,则可以编写自定义持久性存储格式,从Core Data中直接读取/写入旧数据格式(请参阅Atomic Store Programming Guide)。

  2. 声明性地构建一个复杂的NSPredicate有点冗长,但不应该吓倒你。 Predicate Programming Guide是一个很好的开始。当然,您也可以使用字符串格式编写谓词,就像字符串格式的SQL语句一样。值得注意的是,如上所述,核心数据中的谓词位于对象和对象图上,而不在SQL表上。如果你真的想想在表的层面上,坚持与SQLite并编写自己的包装。

1

我不能真正说出你的第一点。但是,关于第二点,使用核心数据意味着您不必担心复杂的查询,因为您可以假装所有关系都已在内存中正确建立(不考虑Apple的实现细节)。无论数据库环境中的联接有多复杂都无关紧要,因为您确实不在数据库环境中。如果您需要获取当前对象的祖父母的第四个孩子,然后找到该孩子的宠物的名称和品种,则只需使用一系列消息或属性在代码中遍历对象树。不用担心连接或任何事情。唯一的问题是它可能真的很慢取决于你的对象的关系,但是我不能准确地说出这个问题,因为我没有真正实现任何使用Core Data的东西(我刚刚在苹果公司和其他公司'网站)。

0

如果从外部源的数据进口商被写入基于相同的核心数据模型(用于导入的靶向/目的地侧) - 没有什么会是概念上不同的作为比较,使用/更新相同的数据(通过实际应用程序的核心数据堆栈)。

如果您在不使用核心数据堆栈的情况下创建数据导入器,请确保您很好地学习了基于核心数据模型生成/预期的数据库模式。这里没有任何魔法 - 只要确保遵循跨实体关系的实现方式以及实体层次结构的存储方式。

我不得不最近从Access数据库创建一个数据导入器到基于Sqlite核心数据库的.NET应用程序中。一旦我的目标核心数据模型被定义,我创建了一个小应用程序,用随机生成的实体(包括所有预期的关系)填充Sqlite存储区。然后,我逆向设计了核心数据是如何为模型创建Sqlite存储的,以及如何通过从生成和持久数据中学习来处理关系。然后,根据我的观察,我实现了基于.NET的导入器/数据转换器。最后,我得到了完美的核心数据友好型数据存储,可以从使用Mac OSX上的核心数据堆栈的应用程序打开修改。