如何在模型对象中有效地解析一对多关系?

时间:2013-11-03 19:00:16

标签: java android sqlite

我在表格中有1:n关系:

表A. id,name,foo,bar

表B. id,x,y,z,id_A

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

我如何解析这个?

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

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

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

看起来像关系数据库的标准情况,但我无法找到有关它的信息。

感谢。

1 个答案:

答案 0 :(得分: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列上的所有记录进行排序并不比在同一列上进行多次查找更有效。 (但是,如果没有该列的索引,查找将比排序慢得多。)