Puni Posté(e) 8 mai 2010 Share Posté(e) 8 mai 2010 Bonjour à tous, Je me suis mis à la programmation Android récemment, et je fais face actuellement à un problème avec ma base de données : J'ai 2 tables : - "matieres", avec un champ "_id" et un autre champ "matiere" - "notes", avec un champ "_id", un champ "note" et un champ "fk_notes_matieres", qui est une clé étrangère faisant référence au champ _id de la table "matieres". Dans mon application, j'aimerais afficher la liste des notes, avec leurs matières respectives. La requète devrais ressembler à quelque chose comme "SELECT matiere, note FROM matieres, notes WHERE fk_notes_matieres = matieres._id". Sauf que je n'arrive pas à formuler correctement la requète pour SQLite... Voici ce que j'ai : db.query("notes, matieres", new String[]{"note", "matiere"}, "fk_notes_matieres=matieres._id", null, null, null, null); Est-ce quelqu'un voit ce que j'ai fait faux ? Je suppose que cela vient de la déclaration des tables, mais je ne vois pas comment faire autrement :( D'avance un grand merci à la personne qui saura me dépanner ! Puni Lien vers le commentaire Partager sur d’autres sites More sharing options...
Alocaly Posté(e) 9 mai 2010 Share Posté(e) 9 mai 2010 Hello, Tu sais que tu peux rentrer tes query directement en SQL, je pense que c'est plus pratique, des fois, surtout pour faire des requetes complexes ( en fait, moi je n 'utilise jamais l'autre syntaxe ) : sqlRequest = "INSERT INTO MyTable (Name) VALUES ('PouetPouet');"; MaDatabse.execSQL( sqlRequest ); Sinon, pour ce que tu veux, je crois qu'il te faut plutot passer par une jointure SQL : SELECT * from matiere join notes on fk_notes_matieres = matieres._id Si j'ai bien compris, c'est plutot ca que tu veux Emmanuel / Alocaly PS : Sinon, j'ai fait il y a longtemps un post sur blog pour expliquer qu'on peut attaquer la BDD directement depuis adb. Des que tu fais un peu des trucs compliqué en BDD, c'est beaucoup plus rapide pour faire ses tests que de passer par son appli !! ( et ca permet de peupler sa base avec des données de tests ! ) : http://androidblogger.blogspot.com/2009/06/tutorial-how-to-access-android-database.html Lien vers le commentaire Partager sur d’autres sites More sharing options...
Puni Posté(e) 9 mai 2010 Auteur Share Posté(e) 9 mai 2010 Pour commencer, merci d'avoir pris le temps de me répondre à 3h du mat :') Je connaissais déjà execSQL, mais j'avais besoin d'un curseur, donc cela ne faisait pas l'affaire. J'ai trouvé la méthode "rawQuery" qui permet de faire une requète SQL tout en ayant un curseur. Mon problème de requête est donc réglé. Cependant, mon programme ne marche toujours pas :< Grâce à la mise en place de logs un peu partout, j'ai trouvé que le problème vient de ces lignes de code : ListAdapter adapter = new SimpleCursorAdapter(this, R.layout.list_item, c, new String[]{"matiere","note"}, new int[]{R.id.TextMatiere, R.id.TextNote}); Le problème, c'est que cela marchait très bien quand j'avais encore ma requête à une seule table... Et j'ai vérifié, mon curseur © contient bien les champs "matiere" et "note"... Le logcat ne m'aide pas vraiment : http://www.yaqua.ch/picz/logcat11.jpg Est-ce que cette erreur "parle" à quelqu'un ? Car là je sèche vraiment :< PS: Merci pour ton article sur la connexion à la bdd, cela risque de m'être fort utile :) Lien vers le commentaire Partager sur d’autres sites More sharing options...
Alocaly Posté(e) 9 mai 2010 Share Posté(e) 9 mai 2010 AH oui, je sais !!! J'ai lu quelque part sur ce forum que les SimpleCursorAdapter ne marchait que sur les tables ou il y a la colonne _id. Ton crash est causé par ca ( il y a une ligne qui dit qu'il ne trouve pas la colonne _id : comme quoi le logcat t'aide, en fait !! ) Je ne sais pas si c'est à cause de ta requete compliquée qui zappe les _id, ou si c'est parce que tu n'as pas de _id du tout dans tes tables. Bref, je ne suis pas sur de savoir comment résoudre le plus simplement possible ton probleme. Ce qui est sur, c'est que tu pourrais refaire ton propre CursorAdapter pour qu'il marche dans ces conditions... Bon courage ! Emmanuel / Alocaly Ps : et meme pas à 3h du mat, tiens !!! Lien vers le commentaire Partager sur d’autres sites More sharing options...
Puni Posté(e) 9 mai 2010 Auteur Share Posté(e) 9 mai 2010 Hum, j'avais également lu que le champ _id est nécessaire, et il est bien présent dans mes 2 tables ! En revanche, ton poste me fait penser que je devrais peut-être les inclure dans ma requête. J'essaie ca demain et je te tiens au courant ! Merci :) Lien vers le commentaire Partager sur d’autres sites More sharing options...
Puni Posté(e) 9 mai 2010 Auteur Share Posté(e) 9 mai 2010 Bon j'étais trop impatient pour attendre demain donc je viens d'essayer: CA MARCHE §§§§ A toutes fins utiles, ma requête finale ressemble à quelque chose comme ca : La requête grâce à la méthode rawQuery qui retourne un curseur (db étant la variable qui contient ma base de donnée): return db.rawQuery("SELECT matieres._id, notes._id, matiere, note FROM matieres, notes WHERE fk_notes_matieres = matieres._id" , null); Encore merci pour ton aide :-) Lien vers le commentaire Partager sur d’autres sites More sharing options...
Recommended Posts
Archivé
Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.