SQLite などの組み込みデータベースでは、クライアント/サーバー通信のオーバーヘッドがないため、実際には次のような小さなクエリを多数実行できます。
SELECT id, x, y, z FROM TableB WHERE id_A = ?
すべての B サブオブジェクトの読み込みに 1 つのクエリを使用したい場合は、次のように2 つの個別のクエリを使用できます。
SELECT id, name, foo, bar FROM TableA ORDER BY id;
SELECT id_A, id, x, y, z FROM TableB ORDER BY id_A;
次に、2 つのカーソルを並行してステップ実行し、各 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
列のすべてのレコードを並べ替えるのは、同じ列で多くのルックアップを実行するよりも効率的ではないためです。(ただし、その列にインデックスがないと、検索は並べ替えよりもはるかに遅くなります。)