使用子查询获取高效的核心数据

时间:2013-10-01 23:17:22

标签: ios sqlite core-data subquery relationship

我遇到了iOS核心数据性能问题。

假设我们有两个类:“Class_A”和“Class_B”。他们俩都有自己的ids和彼此之间的一对一关系。

classes

现在让我们假设我从网上下载数据,允许我创建这些类(数据包含类A和B的ID,以及关于它们关系的信息)。例如:

  • “将有一个ID = 1的Class_A实例”
  • “将有一个id = 2的Class_A实例”
  • “将有一个ID = 3的Class_A实例”
  • “将有一个具有id = 10的Class_B实例”
  • “将有一个具有id = 11”的Class_B实例
  • “将有一个具有id = 12”的Class_B实例
  • “ID = 1的Class_A将与Class_B连接,ID = 12”
  • “ID = 2的Class_A将与Class_B连接,ID = 11”
  • “ID = 3的Class_A将与Class_B连接,ID = 10”

因为所有这些信息都可以按随机顺序获得(例如,关于X和Y类之间的连接的信息可以在关于类X和Y的存在的信息之前下载),我使用了另一种实体:关系。< / p>

关系包含2个字段:class_A_id和class_b_id

relationship

每当我收到有关ClassA和ClassB之间关系的数据时,我都会使用相应的属性值创建Relationship实体的实例。

我正在迭代所有“关系”实体的实例,并尝试创建这样的正确关系:

  1. 获取“关系”实体的所有实例
  2. 根据存储在Relationsip中的“class_A_id”和“class_B_id”ID,为ClassA和ClassB的每个提取的关系提取实例
  3. 如果同时存在ClassA和ClassB的实例 - 在它们之间创建关系。
  4. 从CoreData中删除实例关系
  5. 在实现此算法后,我发现在Core Data中使用相当少量的对象时,它运行良好。 问题是我存储了数千个“关系”实体(关于它们的信息首先被下载),而关于“ClassA”和“ClassB”存在的信息的下载频率较低。

    结果是,每次我尝试使用“关系”实体创建关系时,我都会获取包含不存在的类的id的数千个对象!

    所以我对这个问题的解决方案是增强所提算法的第一步:

    不是获取CoreData中的所有关系,而是仅获取包含系统中存在的类的ID的那些关键字。

    在SQL中它可能看起来像这样:

    SELECT * from 'Relationship' where
        (SELECT * from 'ClassA' where id == class_A_id).count == 1
      AND
        (SELECT * from 'ClassB' where id == class_B_id).count == 1
    

    我的问题是 - 如何在CoreData中实现这样的查询?在那里使用子查询?是的 - 怎么样? :)

1 个答案:

答案 0 :(得分:0)

如果我理解正确,如果你不想修改你的模型太多,你有两个选择:

  • 第一个选项:修改请求流程以仅询问您已经拥有的实体的关系,如果你没有那么多类型为A,B的实体,这可以很容易地完成。否则实现某种“delta”,这将避免成为你不需要的成千上万的关系(除非你出于其他目的需要它)。
  • 第二个选项:当你下载项目时,我认为这是一个后台进程,在这种情况下我会立即在那里进行检查,而不是不时批量处理。例如,您正在下载关系,检查您是否已经有A或B并将关系表标记为完整或不完整(可能添加两个属性aExists bExists)。一旦实体A进入,就将所有关系中的实体标记为aExists,同样适用于B进入,这是一个正常的获取请求,其中class_A_id存在。然后批处理可以轻松扫描并仅获取标记为完成的实体,并创建关系。你必须实现一点逻辑,但在我看来,事情会变得更快。

新的关系将是:

Relationships {
  class_A_id,
  class_B_id,
  classAexists BOOL,
  classBexists BOOL,
  batchRelationshipCreated BOOL,
}

你还可以实现这两个选项: - )