Как мне объединить две таблицы SQLite в моем приложении для Android? - PullRequest
92 голосов
/ 10 февраля 2011

Фон

У меня есть проект 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 ]

197 голосов
/ 10 февраля 2011

Вам нужен 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-запрос.

20 голосов
/ 10 сентября 2011

Альтернативным способом является создание представления, которое затем запрашивается как таблица.Во многих менеджерах баз данных использование представления может привести к повышению производительности.

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 с представлением, поскольку вы подразумевали, что он предпочтительнее.

10 голосов
/ 09 января 2016

В дополнение к ответу @ 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

и, следовательно, можем воспользоваться преимуществом вспомогательного метода SQLiteDatabase.query ()

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

6 голосов
/ 10 февраля 2011

«Неоднозначный столбец» обычно означает, что одно и то же имя столбца появляется как минимум в двух таблицах;ядро базы данных не может сказать, какой вы хотите.Используйте полные имена таблиц или псевдонимы таблиц, чтобы устранить неоднозначность.

Вот пример, который мне довелось увидеть в моем редакторе.Это из чьей-то проблемы, но все равно должно иметь смысл.

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...