SQLite连接时使用相同的列名

时间:2019-09-25 14:23:39

标签: android sqlite android-sqlite

在android studio上使用sqlite,我有两个相关的表“ A”和“ B”,它们都有一个列“ id”。当我加入Android Studio并尝试从“ id”获取值时,无论是否输入,我都会获取“ B.id”

focusOwner

我正在考虑更改列的名称,以便可以轻松区分它们,但是我发现sqlite没有诸如“更改表“ A”重命名列”之类的任何简单内容,但是我必须用正确的名称复制该表并删除旧的表,以便避免这种解决方案。

我还认为一种解决方案是在查询中复制该列,并放置诸如“ Select A.id,* from ...”之类的内容,但我宁愿避免。

有人知道为什么我发布的代码可能行不通吗?谢谢

2 个答案:

答案 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 (偏移量 0
    • 名称 (偏移量 1
  • 和表 B 中的列:
    • id (偏移量 2
    • maptoAid (偏移量 3
    • 等等 (偏移量 4

然后(仅针对上述情况,必须确定偏移量)

要获取 A.id ,请使用cursor.getInt(0); 要获取 B.id ,请使用cursor.getInt(2);

注意:不建议使用偏移量,最好将列别名( AS )与Cursor getColumnIndex 方法一起使用。

  • 偏移量不能容忍对查询的更改,也就是说,更改列的数量或顺序以及偏移量可能需要重新计算。
  • 通过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