【问题标题】:SQLite same column name on join连接时 SQLite 相同的列名
【发布时间】:2019-09-25 14:23:39
【问题描述】:

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

cursor.getInt(cursor.getColumnIndex("A.id")); // or
cursor.getInt(cursor.getColumnIndex("id"));

我正在考虑更改列的名称,以便我可以轻松区分它们,但我已经看到 sqlite 没有任何简单的东西,例如“Alter Table“A”rename column”,但我必须使用正确的名称复制表并删除旧表,因此我试图避免使用此解决方案。

我认为还有一个解决方案是复制查询中的列,放置“Select A.id, * from...”之类的内容,但我宁愿避免这样做。

知道为什么我发布的代码可能不起作用吗?谢谢

【问题讨论】:

  • 为什么不使用别名? SELECT A.id AS ID_A ... 对了,AS这个关键字是可选的,可以省略。
  • 我选择使用 * 而不是放置每一列。
  • 你能告诉我们表格字段吗? A 是主表吗? A和B是如何联系起来的。我们可以看看你的 select 子句吗?

标签: android sqlite android-sqlite


【解决方案1】:

使用游标,您可以(尽管不推荐)使用特定的偏移量(getColumnIndex 方法的作用是返回偏移量,get???? 方法都采用偏移量)。。 p>

所以说查询是SELECT * FROM A JOIN B ON A.id = B.maptoAid

  • A 有列:-
    • id (偏移量 0
    • 名称 (偏移量1
  • 和表B有列:-
    • id(偏移量 2
    • ma​​ptoAid (偏移量 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

【讨论】:

    【解决方案2】:

    为列定义别名,可选择使用* 选择所有其他列。这些不是相互排斥的,因此以下方法将起作用:

    SELECT a.id AS a_id, b.id AS b_id, * FROM ...
    

    即使数据是冗余的,它也会返回别名列以及所有其他列:

    Columns: a_id, b_id, id, ..., id, ...
    

    坦率地说,您无法避免所有解决方案。您已经列出的两个解决方案是您必须选择的所有解决方案。 Sqlite 不会自动为列名添加表名前缀,所以真的没有其他选择。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-27
      • 2016-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多