在android studio上使用sqlite,我有两个相关的表“ A”和“ B”,它们都有一个列“ id”。当我加入Android Studio并尝试从“ id”获取值时,无论是否输入,我都会获取“ B.id”
focusOwner
我正在考虑更改列的名称,以便可以轻松区分它们,但是我发现sqlite没有诸如“更改表“ A”重命名列”之类的任何简单内容,但是我必须用正确的名称复制该表并删除旧的表,以便避免这种解决方案。
我还认为一种解决方案是在查询中复制该列,并放置诸如“ Select A.id,* from ...”之类的内容,但我宁愿避免。
有人知道为什么我发布的代码可能行不通吗?谢谢
答案 0 :(得分:0)
在列上定义别名,可以选择使用*
选择所有其他列。这些不是相互排斥的,因此以下方法将起作用:
SELECT a.id AS a_id, b.id AS b_id, * FROM ...
即使数据是多余的,它也会返回别名列以及所有其他列:
Columns: a_id, b_id, id, ..., id, ...
坦率地说,您无法避免所有解决方案。您已经列出的两种解决方案是您必须选择的全部。 Sqlite不会自动在表名之前添加列名,因此实际上没有其他选择。
答案 1 :(得分:0)
使用游标,您可以(尽管不建议)使用特定的偏移量(getColumnIndex方法执行的操作是返回偏移量,而get ????方法都采用偏移量)。。 >
所以说查询是SELECT * FROM A JOIN B ON A.id = B.maptoAid
和
然后(仅针对上述情况,必须确定偏移量)
要获取 A.id ,请使用cursor.getInt(0);
要获取 B.id ,请使用cursor.getInt(2);
注意:不建议使用偏移量,最好将列别名( AS )与Cursor getColumnIndex 方法一起使用。
例如
SELECT a.id AS aid, b.id AS bid .... other columns (aliased or not) .... FROM A JOIN B ON A.id = B.maptoAid
或更容易编写代码,并产生更大的开销
SELECT *, A.id AS aid, B.id FROM A JOIN B ON A.id = B.maptoAid
然后使用:-
cursor.getInt(cursor.getColumnIndex("aid"));
cursor.getInt(cursor.getColumnIndex("bid"));
无论我放...我都会得到“ B.id” 和 知道为什么我发布的代码可能行不通吗?
之所以得到 B.id 的原因是, getColumnindex
方法在发现列BUT继续循环时并没有完成循环,因此如果有多个具有相同名称的列,则返回最后一个。
还请注意(除非已修复)Cursor getColumnIndex
方法也区分大小写。因此cursor.getInt(cursor.getColumnIndex("Aid"))
将返回 -1 。