我在表格中有1:n关系:
表A. id,name,foo,bar
表B. id,x,y,z,id_A
在我的域模型中,表A的每一行都是一个对象,并包含一个B的集合。
我如何解析这个?
我可以先对A进行查询然后在解析循环中为每一行执行查询到B.但这看起来效率不高。
我也尝试了连接查询,但这为B的每个条目添加了一个新行,然后我无法将每个行映射到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
列上的所有记录进行排序并不比在同一列上进行多次查找更有效。 (但是,如果没有该列的索引,查找将比排序慢得多。)