SQLite:从连接的游标中提取_id

时间:2018-01-06 22:12:29

标签: android sqlite android-sqlite

我有两张桌子:

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]。按表显式检索列索引也不起作用。

1 个答案:

答案 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?