0

我在表中有 1:n 关系:

表 A id, name, foo, bar

表 B id, x, y, z, id_A

在我的域模型中,表 A 的每一行都是一个对象,并且包含 B 的集合。

我该如何解析这个?

我可以先查询 A,然后在解析循环中,为每一行查询 B。但这看起来效率不高。

我也尝试过加入查询,但这会为 B 的每个条目添加一个新行,然后我无法将这些行中的每一行映射到 1 个模型对象。

是否有一个查询可以让我将额外的连接行“减少”到一个聚合结果?

看起来像是关系数据库的标准案例,但我找不到有关它的信息。

谢谢。

4

1 回答 1

1

在像 SQLite 这样的嵌入式数据库中,没有客户端/服务器通信开销,因此执行大量这样的小查询实际上是可行的:

SELECT id, x, y, z FROM TableB WHERE id_A = ?

如果您真的想使用单个查询来加载所有 B 子对象,则可以使用两个单独的查询,如下所示:

SELECT id,   name, foo, bar FROM TableA ORDER BY id;
SELECT id_A, id, x, y, z    FROM TableB ORDER BY id_A;

然后,您将并行遍历两个游标,并为每个 A 记录收集具有相同 ID 的所有 B 记录;ORDER BY 子句确保您以正确的顺序查看它们:

cursorA = db.query(...);
cursorB = db.query(...);
cursorB.moveToFirst();
while (cursorA.moveToNext()) {
    id = cursor.getInt(0);
    a = new ObjectA(id, ...);
    while (!cursorB.isAfterLast() &&
           cursorB.getInt(0) == id) {
        b = new ObjectB(...);
        a.addB(b);
        cursorB.moveToNext();
    }
}

请注意,这可能不会比对每个 A 进行单独查询更有效,因为对id_A列上的所有记录进行排序并不比在同一列上进行多次查找更有效。(但是,如果该列上没有索引,查找将比排序慢得多。)

于 2013-11-03T20:19:32.480 回答