Задний план
У меня есть проект Android, в котором есть база данных с двумя таблицами: tbl_question
и tbl_alternative
.
Чтобы заполнить представления вопросами и альтернативами, я использую курсоры. Нет проблем с получением нужных мне данных, пока я не попытаюсь объединить две таблицы.
Tbl_question ------------- _мне бы вопрос categoryid
Tbl_alternative --------------- _мне бы вопросид categoryid альтернатива
Я хочу что-то вроде следующего:
SELECT tbl_question.question, tbl_alternative.alternative where
categoryid=tbl_alternative.categoryid AND tbl_question._id =
tbl_alternative.questionid.`
Это моя попытка:
public Cursor getAlternative(long categoryid) {
String[] columns = new String[] { KEY_Q_ID, KEY_IMAGE, KEY_QUESTION, KEY_ALT, KEY_QID};
String whereClause = KEY_CATEGORYID + "=" + categoryid +" AND "+ KEY_Q_ID +"="+ KEY_QID;
Cursor cursor = mDb.query(true, DBTABLE_QUESTION + " INNER JOIN "+ DBTABLE_ALTERNATIVE, columns, whereClause, null, null, null, null, null);
if (cursor != null) {
cursor.moveToFirst();
}
return cursor;
Я считаю, что этот способ формирования запросов сложнее, чем обычный SQL, но я получил совет использовать этот способ, поскольку он менее подвержен ошибкам.
Вопрос
Как мне объединить две таблицы SQLite в моем приложении?
Ответы:
Вам нужен метод rawQuery .
Пример:
Использовать? привязки вместо помещения значений в необработанный запрос sql.
источник
VIEW
лучшего варианта, чемrawQuery
?Альтернативный способ - создать представление, которое затем запрашивается, как таблица. Во многих менеджерах баз данных использование представления может повысить производительность.
Это из памяти, поэтому могут быть некоторые синтаксические проблемы. http://www.sqlite.org/lang_createview.html
Я упоминаю этот подход, потому что тогда вы можете использовать SQLiteQueryBuilder с представлением, поскольку вы подразумевали, что это предпочтительнее.
источник
rawQuery()
это правильный ответ.В дополнение к ответу @ pawelzieba, который определенно верен, для объединения двух таблиц, в то время как вы можете использовать
INNER JOIN
такойчерез необработанный запрос, подобный этому -
из-за обратной совместимости SQLite с поддержкой примитивного способа запросов, мы превращаем эту команду в следующую:
и, следовательно, иметь возможность воспользоваться вспомогательным методом SQLiteDatabase.query ()
Подробное сообщение в блоге можно найти на http://blog.championswimmer.in/2015/12/doing-a-table-join-in-android-without-using-rawquery
источник
android.database.sqlite.SQLiteException: ambiguous column name
«Неоднозначный столбец» обычно означает, что одно и то же имя столбца встречается как минимум в двух таблицах; механизм базы данных не может сказать, какой из них вам нужен. Используйте полные имена таблиц или псевдонимы таблиц, чтобы устранить двусмысленность.
Вот пример, который у меня был в моем редакторе. Это из-за чужой проблемы, но в любом случае должно иметь смысл.
источник