我有两张桌子:
A
_id, name
1 , a
B
_id, name, a_id
2 , b , 1
如何从连接查询中检索A._id或A.name,例如
public Map<String, String> query() {
String sql = "SELECT * FROM A JOIN B ON A._id = B.a_id";
try (Cursor csr = getReadableDatabase().rawQuery(sql, null)) {
HashMap<String, String> map = new HashMap<>();
if (csr.moveToNext()) {
map.put("_id", csr.getString(csr.getColumnIndex("_id")));
map.put("name", csr.getString(csr.getColumnIndex("name")));
}
return map;
}
}
And Helper#query仅返回[_id = 2,name = b]。按表显式检索列索引也不起作用。
答案 0 :(得分:1)
问题是游标列名称不包含表名,因此您的游标有两个 _id
列。
从有限测试getColumnIndex
返回具有相同名称的最后一列的偏移量。
修复方法是确保列名称是唯一的,这可以使用 AS
来实现,例如: -
public Map<String, String> query() {
String sql = "SELECT *, A._id AS A_id, B._id AS B_id FROM A JOIN B ON A._id = B.a_id"; //<<<<<< added AS
try (Cursor csr = getReadableDatabase().rawQuery(sql, null)) {
HashMap<String, String> map = new HashMap<>();
if (csr.moveToNext()) {
map.put("_id", csr.getString(csr.getColumnIndex("A_id"))); //<<<< use column alias
map.put("name", csr.getString(csr.getColumnIndex("name")));
}
return map;
}
}
这使您可以消除更有问题/更不灵活的硬编码列偏移。
更全面的答案是here - How do I access individual _id columns when there are multiple _id columns from a join?