Как объединить две таблицы SQLite в моем приложении для Android?
фон
у меня есть проект Android, который имеет базу данных с двумя таблицами: tbl_question
и tbl_alternative
.
для заполнения представлений вопросами и альтернативами я использую курсоры. Нет никаких проблем в получении данных, которые мне нужны, пока я не попытаюсь объединить две таблицы.
Tbl_question ------------- _id question categoryid
Tbl_alternative --------------- _id questionid categoryid alternative
Я хочу что-то вроде следующего:
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 в моем приложении?
4 ответа:
вам нужно rawQuery метод.
пример:
private final String MY_QUERY = "SELECT * FROM table_a a INNER JOIN table_b b ON a.id=b.other_id WHERE b.property_id=?"; db.rawQuery(MY_QUERY, new String[]{String.valueOf(propertyId)});
использовать ? привязки вместо ввода значений в SQL-запрос.
альтернативный способ-построить представление, которое затем запрашивается так же, как таблица. Во многих менеджерах баз данных использование представления может привести к повышению производительности.
CREATE VIEW xyz SELECT q.question, a.alternative FROM tbl_question AS q, tbl_alternative AS a WHERE q.categoryid = a.categoryid AND q._id = a.questionid;
Это из памяти, так что могут быть некоторые синтаксические проблемы. http://www.sqlite.org/lang_createview.html
я упоминаю этот подход, потому что тогда вы можете использовать SQLiteQueryBuilder с представлением, как вы подразумевали, что он был предпочтительным.
в дополнение к ответу @ pawelzieba, который определенно является правильным, чтобы объединить две таблицы, в то время как вы можете использовать
INNER JOIN
такойSELECT * FROM expense INNER JOIN refuel ON exp_id = expense_id WHERE refuel_id = 1
через необработанный запрос, как это -
String rawQuery = "SELECT * FROM " + RefuelTable.TABLE_NAME + " INNER JOIN " + ExpenseTable.TABLE_NAME + " ON " + RefuelTable.EXP_ID + " = " + ExpenseTable.ID + " WHERE " + RefuelTable.ID + " = " + id; Cursor c = db.rawQuery( rawQuery, null );
из - за обратной совместимой поддержки SQLite примитивного способа запроса мы превращаем эту команду в эту -
SELECT * FROM expense, refuel WHERE exp_id = expense_id AND refuel_id = 1
и, следовательно, быть в состоянии принять advanatage из SQLiteDatabase.запрос() вспомогательный метод
Cursor c = db.query( RefuelTable.TABLE_NAME + " , " + ExpenseTable.TABLE_NAME, Utils.concat(RefuelTable.PROJECTION, ExpenseTable.PROJECTION), RefuelTable.EXP_ID + " = " + ExpenseTable.ID + " AND " + RefuelTable.ID + " = " + id, null, null, null, null );
для подробного сообщения в блоге проверить это http://blog.championswimmer.in/2015/12/doing-a-table-join-in-android-without-using-rawquery
"неоднозначный столбец" обычно означает, что одно и то же имя столбца появляется по крайней мере в двух таблицах; компонент database engine не может сказать, какой из них вы хотите. Используйте полные имена таблиц или псевдонимы таблиц, чтобы устранить неоднозначность.
вот пример, который мне довелось иметь в моем редакторе. Это от чужой проблемы, но все равно должно иметь смысл.
select P.* from product_has_image P inner join highest_priority_images H on (H.id_product = P.id_product and H.priority = p.priority)