SQLite то же имя столбца при объединении - PullRequest
0 голосов
/ 25 сентября 2019

Используя sqlite на Android Studio, у меня есть две связанные таблицы "A" и "B", которые обе имеют столбец "id".Когда я выполняю объединение в Android Studio и пытаюсь получить значение из «id», я получаю «B.id», независимо от того, поставил ли я

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

, я подумываю изменить имя столбцов, чтобы яЯ могу легко их различить, но я видел, что в sqlite нет такой простой вещи, как «Изменить таблицу» и «Переименовать столбец», но мне пришлось бы дублировать таблицу с правильным именем и удалить старое, чтобы яЯ пытаюсь избежать этого решения.

Также решение, которое я подумал, состоит в том, чтобы дублировать столбец в запросе, добавив что-то вроде «Select A.id, * from ...», но я бы предпочел этого избежать..

Есть идеи, почему мой код может не работать?Спасибо

Ответы [ 2 ]

0 голосов
/ 26 сентября 2019

С помощью курсора вы можете (хотя и не рекомендуется) использовать определенные смещения (метод 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 ) вместе с курсором 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 не завершает цикл, когда находит столбец, НОпродолжает цикл, возвращая последний, если существует более одного столбца с одинаковым именем.

Также обратите внимание (если не исправлено), что метод Cursor getColumnIndex также чувствителен к регистру.Так что cursor.getInt(cursor.getColumnIndex("Aid")) вернет -1 .

0 голосов
/ 25 сентября 2019

Определите псевдоним для столбцов, при необходимости выбрав все остальные столбцы с помощью *.Они не являются взаимоисключающими, поэтому будет работать следующее:

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

Он вернет столбцы с псевдонимами вместе со всеми остальными, даже если данные являются избыточными:

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

Честно говоря,Вы не можете избежать всех решений.Два решения, которые вы уже перечислили, - это все, что вам нужно выбрать.В Sqlite имена таблиц автоматически не добавляются к именам столбцов, поэтому других вариантов на самом деле нет.

...