95 votes

Comment joindre deux tables SQLite dans mon application Android?

Arrière-plan

J'ai un projet Android qui dispose d'une base de données avec deux tableaux: tbl_question et tbl_alternative.

Pour remplir les vues avec des questions et des solutions de rechange, je suis en utilisant les curseurs. Il n'y a pas de difficultés à obtenir les données dont j'ai besoin jusqu'à ce que j'essaie 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.` 

C'est 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 cette façon de créer des requêtes plus dur que le standard SQL, mais ont obtenu les conseils d'utilisation de cette façon car il est moins sujette aux erreurs.

Question

Comment puis-je joindre deux tables SQLite dans mon application?

201voto

pawelzieba Points 10393

Vous avez besoin de la méthode rawQuery .

Exemple:

 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)});
 

Utilisation ? des liaisons au lieu de mettre des valeurs dans une requête sql brute.

20voto

phreed Points 724

Une autre façon est de construire un point de vue qui est ensuite interrogée comme une table. Dans de nombreux gestionnaires de base de données à l'aide d'un point de vue peut aboutir à de meilleures performances.

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;

C'est à partir de la mémoire si il peut y avoir certains syntaxique questions. http://www.sqlite.org/lang_createview.html

Je vous parle de cette approche, car alors vous pouvez utiliser SQLiteQueryBuilder avec la vue que vous vous supposer qu'il était préférable.

8voto

Ambiguë "de la colonne" signifie généralement que le même nom de colonne apparaît dans au moins deux tables; le moteur de base de données ne peut pas dire que l'on vous le souhaitez. L'utilisation complète de la table des noms ou alias de table pour lever l'ambiguïté.

Voici un exemple m'est arrivé d'avoir dans mon éditeur. C'est à partir de quelqu'un d'autre, mais doit faire sens de toute façon.

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)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X