Puni Posted May 8, 2010 Share Posted May 8, 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 Link to comment Share on other sites More sharing options...
Alocaly Posted May 9, 2010 Share Posted May 9, 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 Link to comment Share on other sites More sharing options...
Puni Posted May 9, 2010 Author Share Posted May 9, 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 :) Link to comment Share on other sites More sharing options...
Alocaly Posted May 9, 2010 Share Posted May 9, 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 !!! Link to comment Share on other sites More sharing options...
Puni Posted May 9, 2010 Author Share Posted May 9, 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 :) Link to comment Share on other sites More sharing options...
Puni Posted May 9, 2010 Author Share Posted May 9, 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 :-) Link to comment Share on other sites More sharing options...
Recommended Posts
Archived
This topic is now archived and is closed to further replies.