Android: sqlite: cursor: getColumnIndex

У меня довольно сложный запрос (несколько объединений) в нормализованной базе данных sqlite. Запрос выполняет SELECT *, чтобы включить некоторую автоматическую логику выбора атрибутов (поэтому я не могу устранить "*" )

Проблема, с которой я столкнулась, состоит в том, что мой результирующий набор содержит несколько столбцов с тем же именем атрибута. Например, один атрибут, общий для каждой таблицы в запросе, - "_id". Когда я перехожу к вызову "cursor.getColumnIndex("_id")", возвращаемое значение всегда является индексом последнего атрибута "_id" в списке столбцов набора результатов (т.е. Не тот, который я хочу). Мне бы очень хотелось использовать префиксы псевдонимов SQL, например cursor.getColumnIndex("A._id"), но это не работает.

Вопросы

Похоже, что cursor.getColumnIndex(AttributeName) возвращает индекс последнего "AttributeName" . Может ли кто-нибудь подтвердить это? Кроме того, любые предложения о том, как вернуть индекс 1-го атрибута с именем "AttributeName" ? или лучше X-й атрибут с именем "AttributeName" ?

Ответ 1

Вы можете сделать это:

SELECT _id as myID, * FROM myTable

Это означает, что поле _id будет отображаться дважды для каждой таблицы в ваших результатах, но один из двух столбцов будет иметь уникальное имя, которое должно позволить вам его найти.

Ответ 2

К сожалению, документация не упоминает ничего о том, что вам нужно делать, поэтому я предполагаю, что это невозможно.

Однако вы говорите

В запросе используется SELECT * для включения некоторого автоматического выбора атрибутов логики (поэтому я не могу устранить "*" )

Что это за "автоматическая логика выбора атрибутов", о которой вы говорите? Зачем вам это нужно?

Ответ 3

Другое решение:

"SELECT tableName.columnName FROM tableName"

а затем выполните то же самое с:

cursor.getColumnIndex("tableName.columnName");

Это то, что делает MS-Access. Вы можете создать запрос, а затем просмотреть сгенерированный код SQL (просто перейдите в меню "Просмотр" и выберите "SQL-представление" из окна запроса dessign)