Contexte
J'ai un projet Android qui a une base de données avec deux tables: tbl_question
et tbl_alternative
.
Pour remplir les vues avec des questions et des alternatives, j'utilise des curseurs. Il n'y a aucun problème pour obtenir les données dont j'ai besoin jusqu'à ce que j'essaye de joindre les deux tables.
Tbl_question ------------- _id question categoryid
Tbl_alternative --------------- _id questionid categoryid alternative
Je veux quelque chose comme ce qui suit:
SELECT tbl_question.question, tbl_alternative.alternative where
categoryid=tbl_alternative.categoryid AND tbl_question._id =
tbl_alternative.questionid.`
Voici ma tentative:
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;
Je trouve que cette façon de former des requêtes est plus difficile que le SQL ordinaire, mais j'ai reçu le conseil de l'utiliser car elle est moins sujette aux erreurs.
Question
Comment joindre deux tables SQLite dans mon application?
Réponses:
Vous avez besoin de la méthode rawQuery .
Exemple:
Utilisation ? liaisons au lieu de mettre des valeurs dans une requête SQL brute.
la source
VIEW
une meilleure option querawQuery
?Une autre manière consiste à construire une vue qui est ensuite interrogée comme une table. Dans de nombreux gestionnaires de bases de données, l'utilisation d'une vue peut améliorer les performances.
Cela vient de mémoire, il peut donc y avoir des problèmes de syntaxe. http://www.sqlite.org/lang_createview.html
Je mentionne cette approche car vous pouvez alors utiliser SQLiteQueryBuilder avec la vue, car vous avez laissé entendre qu'elle était préférée.
la source
rawQuery()
c'est la bonne réponse.En plus de la réponse de @ pawelzieba, qui est certainement correcte, joindre deux tables, alors que vous pouvez utiliser un
INNER JOIN
comme celui-civia une requête brute comme celle-ci -
en raison de la prise en charge rétrocompatible de SQLite de la manière primitive d'interroger, nous transformons cette commande en ceci -
et donc pouvoir profiter de la méthode d'assistance SQLiteDatabase.query ()
Pour un article de blog détaillé, consultez ce http://blog.championswimmer.in/2015/12/doing-a-table-join-in-android-without-using-rawquery
la source
android.database.sqlite.SQLiteException: ambiguous column name
«Colonne ambiguë» signifie généralement que le même nom de colonne apparaît dans au moins deux tableaux; le moteur de base de données ne peut pas dire lequel vous voulez. Utilisez des noms de table complets ou des alias de table pour supprimer l'ambiguïté.
Voici un exemple que j'ai eu dans mon éditeur. Cela vient du problème de quelqu'un d'autre, mais cela devrait avoir un sens de toute façon.
la source