fundo
Tenho um projeto Android que possui um banco de dados com duas tabelas: tbl_question
e tbl_alternative
.
Para preencher as visualizações com perguntas e alternativas, estou usando cursores. Não há problemas em obter os dados de que preciso até tentar unir as duas tabelas.
Tbl_question ------------- _Eu iria questão Categoria ID
Tbl_alternative --------------- _Eu iria questionid Categoria ID alternativo
Eu quero algo como o seguinte:
SELECT tbl_question.question, tbl_alternative.alternative where
categoryid=tbl_alternative.categoryid AND tbl_question._id =
tbl_alternative.questionid.`
Esta é minha tentativa:
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;
Acho que essa maneira de formar consultas é mais difícil do que o SQL regular, mas recebi o conselho para usar dessa forma, pois é menos sujeita a erros.
Questão
Como faço para unir duas tabelas SQLite em meu aplicativo?
Respostas:
Você precisa do método rawQuery .
Exemplo:
Usar ? ligações em vez de colocar valores em consulta sql bruta.
fonte
VIEW
opção melhor do querawQuery
?Uma forma alternativa é construir uma visão que é então consultada como uma tabela. Em muitos gerenciadores de banco de dados, o uso de uma visualização pode resultar em melhor desempenho.
Isso é de memória, portanto, pode haver alguns problemas sintáticos. http://www.sqlite.org/lang_createview.html
Menciono essa abordagem porque então você pode usar SQLiteQueryBuilder com a visão, pois você deu a entender que era a preferida.
fonte
rawQuery()
é a resposta certa.Além da resposta de @pawelzieba, que definitivamente está correta, juntar duas tabelas, enquanto você pode usar um
INNER JOIN
como estevia consulta bruta como esta -
por causa do suporte compatível com versões anteriores do SQLite da forma primitiva de consulta, transformamos esse comando neste -
e, portanto, ser capaz de obter vantagem do método auxiliar SQLiteDatabase.query ()
Para uma postagem detalhada no blog, verifique esta http://blog.championswimmer.in/2015/12/doing-a-table-join-in-android-without-using-rawquery
fonte
android.database.sqlite.SQLiteException: ambiguous column name
"Coluna ambígua" geralmente significa que o mesmo nome de coluna aparece em pelo menos duas tabelas; o mecanismo de banco de dados não sabe qual você deseja. Use nomes de tabela completos ou aliases de tabela para remover a ambiguidade.
Aqui está um exemplo que por acaso tive em meu editor. É problema de outra pessoa, mas deve fazer sentido de qualquer maneira.
fonte