Gabin Posté(e) 1 mars 2011 Share Posté(e) 1 mars 2011 (modifié) Bonsoir, Je viens de mettre en place (ou du moins j'ai essayé :P) une base de donnée sqlite. Celle ci me permet (enfin doit me permettre) de garder une configuration en mémoire. J'ai apparemment un problème de colonne mais je n'arrive pas à déceler lequel. Voici mon logcat : 03-01 23:06:05.144: INFO/Database(13183): sqlite returned: error code = 1, msg = table table_plannings has no column named ID_USE 03-01 23:06:05.175: ERROR/Database(13183): Error inserting Titre=ASUB ID_ADE=0 ID_USE=98 03-01 23:06:05.175: ERROR/Database(13183): android.database.sqlite.SQLiteException: table table_plannings has no column named ID_USE: , while compiling: INSERT INTO table_plannings(Titre, ID_ADE, ID_USE) VALUES(?, ?, ?); 03-01 23:06:05.175: ERROR/Database(13183): at android.database.sqlite.SQLiteCompiledSql.native_compile(Native Method) 03-01 23:06:05.175: ERROR/Database(13183): at android.database.sqlite.SQLiteCompiledSql.compile(SQLiteCompiledSql.java:91) 03-01 23:06:05.175: ERROR/Database(13183): at android.database.sqlite.SQLiteCompiledSql.<init>(SQLiteCompiledSql.java:64) 03-01 23:06:05.175: ERROR/Database(13183): at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:80) 03-01 23:06:05.175: ERROR/Database(13183): at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:36) 03-01 23:06:05.175: ERROR/Database(13183): at android.database.sqlite.SQLiteDatabase.compileStatement(SQLiteDatabase.java:1254) 03-01 23:06:05.175: ERROR/Database(13183): at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1645) 03-01 23:06:05.175: ERROR/Database(13183): at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1519) 03-01 23:06:05.175: ERROR/Database(13183): at net.mecadev.empdtps.univorleans.PlanningsBDD.insertPlanning(PlanningsBDD.java:54) 03-01 23:06:05.175: ERROR/Database(13183): at net.mecadev.empdtps.univorleans.Main$2.onClick(Main.java:411) 03-01 23:06:05.175: ERROR/Database(13183): at android.view.View.performClick(View.java:2461) 03-01 23:06:05.175: ERROR/Database(13183): at android.view.View$PerformClick.run(View.java:8890) 03-01 23:06:05.175: ERROR/Database(13183): at android.os.Handler.handleCallback(Handler.java:587) 03-01 23:06:05.175: ERROR/Database(13183): at android.os.Handler.dispatchMessage(Handler.java:92) 03-01 23:06:05.175: ERROR/Database(13183): at android.os.Looper.loop(Looper.java:123) 03-01 23:06:05.175: ERROR/Database(13183): at android.app.ActivityThread.main(ActivityThread.java:4627) 03-01 23:06:05.175: ERROR/Database(13183): at java.lang.reflect.Method.invokeNative(Native Method) 03-01 23:06:05.175: ERROR/Database(13183): at java.lang.reflect.Method.invoke(Method.java:521) 03-01 23:06:05.175: ERROR/Database(13183): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:871) 03-01 23:06:05.175: ERROR/Database(13183): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:629) 03-01 23:06:05.175: ERROR/Database(13183): at dalvik.system.NativeStart.main(Native Method) 03-01 23:06:05.179: INFO/Database(13183): sqlite returned: error code = 1, msg = table table_plannings has no column named ID_USE 03-01 23:06:05.198: ERROR/Database(13183): Error inserting Titre=L1 - SPT ID_ADE=0 ID_USE=99 03-01 23:06:05.198: ERROR/Database(13183): android.database.sqlite.SQLiteException: table table_plannings has no column named ID_USE: , while compiling: INSERT INTO table_plannings(Titre, ID_ADE, ID_USE) VALUES(?, ?, ?); 03-01 23:06:05.198: ERROR/Database(13183): at android.database.sqlite.SQLiteCompiledSql.native_compile(Native Method) 03-01 23:06:05.198: ERROR/Database(13183): at android.database.sqlite.SQLiteCompiledSql.compile(SQLiteCompiledSql.java:91) 03-01 23:06:05.198: ERROR/Database(13183): at android.database.sqlite.SQLiteCompiledSql.<init>(SQLiteCompiledSql.java:64) 03-01 23:06:05.198: ERROR/Database(13183): at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:80) 03-01 23:06:05.198: ERROR/Database(13183): at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:36) 03-01 23:06:05.198: ERROR/Database(13183): at android.database.sqlite.SQLiteDatabase.compileStatement(SQLiteDatabase.java:1254) 03-01 23:06:05.198: ERROR/Database(13183): at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1645) 03-01 23:06:05.198: ERROR/Database(13183): at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1519) 03-01 23:06:05.198: ERROR/Database(13183): at net.mecadev.empdtps.univorleans.PlanningsBDD.insertPlanning(PlanningsBDD.java:54) 03-01 23:06:05.198: ERROR/Database(13183): at net.mecadev.empdtps.univorleans.Main$2.onClick(Main.java:412) 03-01 23:06:05.198: ERROR/Database(13183): at android.view.View.performClick(View.java:2461) 03-01 23:06:05.198: ERROR/Database(13183): at android.view.View$PerformClick.run(View.java:8890) 03-01 23:06:05.198: ERROR/Database(13183): at android.os.Handler.handleCallback(Handler.java:587) 03-01 23:06:05.198: ERROR/Database(13183): at android.os.Handler.dispatchMessage(Handler.java:92) 03-01 23:06:05.198: ERROR/Database(13183): at android.os.Looper.loop(Looper.java:123) 03-01 23:06:05.198: ERROR/Database(13183): at android.app.ActivityThread.main(ActivityThread.java:4627) 03-01 23:06:05.198: ERROR/Database(13183): at java.lang.reflect.Method.invokeNative(Native Method) 03-01 23:06:05.198: ERROR/Database(13183): at java.lang.reflect.Method.invoke(Method.java:521) 03-01 23:06:05.198: ERROR/Database(13183): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:871) 03-01 23:06:05.198: ERROR/Database(13183): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:629) 03-01 23:06:05.198: ERROR/Database(13183): at dalvik.system.NativeStart.main(Native Method) Voici mes codes : Main.java (bout du code) // Voici ce qui se passe lors du clic qui permet la sauvegarde du planning PlanningsBDD planningbdd = new PlanningsBDD(this); Planning planSaveComp = new Planning( spos_Comp , sname_Comp , 98); Planning planSaveFil = new Planning(spos_Fil, sname_Fil, 99); planningbdd.open(); planningbdd.insertPlanning(planSaveComp); planningbdd.insertPlanning(planSaveFil); planningbdd.close(); // l'erreur intervient dès l'appui sur le bouton de sauvegarde // Voici ce qui se passe lors du clic qui permet de récupérer les données de la sauvegarde du planning Planning planRecupComp; Planning planRecupFil; planningbdd.open(); planRecupComp = planningbdd.getPlanningWithIdUse(98); planRecupFil = planningbdd.getPlanningWithIdUse(99); int posRecupComp = planRecupComp.getIdAde(); int posRecupFil = planRecupFil.getIdAde(); // et si je continu, l'application crash (Force Close) à la récupération des données Planning.java public class Planning { private int id; private String titre; private int id_ade; private int id_use; public Planning(){} public Planning(int id_ade, String titre, int id_use){ this.titre = titre; this.id_ade = id_ade; this.id_use = id_use; } public int getId() { return id; } public void setId(int id) { this.id = id; } public int getIdUse(){ return id_use; } public void setIdUse(int id_use){ this.id_use = id_use; } public int getIdAde() { return id_ade; } public void setIdAde(int id_ade) { this.id_ade = id_ade; } public String getTitre() { return titre; } public void setTitre(String titre) { this.titre = titre; } public String toString(){ return "ID : "+id+"\nID ADE : "+id_ade+"\nTitre : "+titre; } } MaBaseSQLite.java import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.database.sqlite.SQLiteDatabase.CursorFactory; public class MaBaseSQLite extends SQLiteOpenHelper { private static final String TABLE_PLANNINGS = "table_plannings"; private static final String COL_ID = "ID"; private static final String COL_ID_ADE = "ID_ADE"; private static final String COL_TITRE = "Titre"; private static final String COL_ID_USE = "ID_USE"; private static final String CREATE_BDD = "CREATE TABLE " + TABLE_PLANNINGS + " (" + COL_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + COL_ID_ADE + " INT, " + COL_TITRE + " TEXT NOT NULL," + COL_ID_USE + " INT);"; public MaBaseSQLite(Context context, String name, CursorFactory factory, int version) { super(context, name, factory, version); } @Override public void onCreate(SQLiteDatabase db) { //on créé la table à partir de la requête écrite dans la variable CREATE_BDD db.execSQL(CREATE_BDD); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { //On peut fait ce qu'on veut ici moi j'ai décidé de supprimer la table et de la recréer //comme ça lorsque je change la version les id repartent de 0 db.execSQL("DROP TABLE " + TABLE_PLANNINGS + ";"); onCreate(db); } } et enfin, PlanningsBDD.java import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; public class PlanningsBDD { private static final int VERSION_BDD = 1; private static final String NOM_BDD = "mesplannings.db"; private static final String TABLE_PLANNINGS = "table_plannings"; private static final String COL_ID = "ID"; private static final int NUM_COL_ID = 0; private static final String COL_ID_ADE = "ID_ADE"; private static final int NUM_COL_ID_ADE = 1; private static final String COL_TITRE = "Titre"; private static final int NUM_COL_TITRE = 2; private static final String COL_ID_USE = "ID_USE"; private static final int NUM_COL_ID_USE = 3; private SQLiteDatabase bdd; private MaBaseSQLite maBaseSQLite; public PlanningsBDD(Context context){ //On créer la BDD et sa table maBaseSQLite = new MaBaseSQLite(context, NOM_BDD, null, VERSION_BDD); } public void open(){ //on ouvre la BDD en écriture bdd = maBaseSQLite.getWritableDatabase(); } public void close(){ //on ferme l'accès à la BDD bdd.close(); } public SQLiteDatabase getBDD(){ return bdd; } public long insertPlanning(Planning planning){ //Création d'un ContentValues (fonctionne comme une HashMap) ContentValues values = new ContentValues(); //on lui ajoute une valeur associé à une clé (qui est le nom de la colonne dans laquelle on veut mettre la valeur) values.put(COL_ID_ADE, planning.getIdAde()); values.put(COL_TITRE, planning.getTitre()); values.put(COL_ID_USE, planning.getIdUse()); //on insère l'objet dans la BDD via le ContentValues return bdd.insert(TABLE_PLANNINGS, null, values); } public int updatePlanning(int id, Planning planning){ //La mise à jour d'un livre dans la BDD fonctionne plus ou moins comme une insertion //il faut simple préciser quelle livre on doit mettre à jour grâce à l'ID ContentValues values = new ContentValues(); values.put(COL_ID_ADE, planning.getIdAde()); values.put(COL_TITRE, planning.getTitre()); values.put(COL_ID_USE, planning.getIdUse()); return bdd.update(TABLE_PLANNINGS, values, COL_ID + " = " +id, null); } public int removePlanningWithID(int id){ //Suppression d'un livre de la BDD grâce à l'ID return bdd.delete(TABLE_PLANNINGS, COL_ID + " = " +id, null); } public Planning getPlanningWithTitre(String titre){ //Récupère dans un Cursor les valeur correspondant à un livre contenu dans la BDD (ici on sélectionne le livre grâce à son titre) Cursor c = bdd.query(TABLE_PLANNINGS, new String[] {COL_ID, COL_ID_ADE, COL_TITRE, COL_ID_USE}, COL_TITRE + " LIKE \"" + titre +"\"", null, null, null, null); return cursorToPlanning(c); } public Planning getPlanningWithIdUse(Integer id_use){ //Récupère dans un Cursor les valeur correspondant à un livre contenu dans la BDD (ici on sélectionne le livre grâce à son titre) Cursor c = bdd.query(TABLE_PLANNINGS, new String[] {COL_ID, COL_ID_ADE, COL_TITRE, COL_ID_USE}, COL_ID_USE + " LIKE \"" + id_use +"\"", null, null, null, null); return cursorToPlanning(c); } //Cette méthode permet de convertir un cursor en un livre private Planning cursorToPlanning(Cursor c){ //si aucun élément n'a été retourné dans la requête, on renvoie null if (c.getCount() == 0) return null; //Sinon on se place sur le premier élément c.moveToFirst(); //On créé un livre Planning planning = new Planning(); //on lui affecte toutes les infos grâce aux infos contenues dans le Cursor planning.setId(c.getInt(NUM_COL_ID)); planning.setIdAde(c.getInt(NUM_COL_ID_ADE)); planning.setTitre(c.getString(NUM_COL_TITRE)); planning.setIdUse(c.getInt(NUM_COL_ID_USE)); //On ferme le cursor c.close(); //On retourne le livre return planning; } } Merci pour votre aide :) Modifié 4 mars 2011 par G&Dev Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
chpil Posté(e) 2 mars 2011 Share Posté(e) 2 mars 2011 Il te dit qu'il ne trouve pas la colonne ID_USE dans la table table_plannings. Il semblerait que la création de la table ne se passe pas bien... Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
fifix Posté(e) 2 mars 2011 Share Posté(e) 2 mars 2011 Pourquoi est ce qu'il y a des "?" sur la 3eme ligne de ton code? 03-01 23:06:05.175: ERROR/Database(13183): android.database.sqlite.SQLiteException: table table_plannings has no column named ID_USE: , while compiling: INSERT INTO table_plannings(Titre, ID_ADE, ID_USE) VALUES(?, ?, ?); Parce que s'il cherche vraiment à mettre un ? dans ton champ int il va pas allez loin. Sinon ton code à l'aire de marcher donc je te conseil d'exporter ta base (après insertion de tes lignes) avec l’émulateur et de la lire avec un lecteur de base sqlite . Et là tu verra si ta table est bien rentré. Cordialement Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
chpil Posté(e) 2 mars 2011 Share Posté(e) 2 mars 2011 Pourquoi est ce qu'il y a des "?" sur la 3eme ligne de ton code?03-01 23:06:05.175: ERROR/Database(13183): android.database.sqlite.SQLiteException: table table_plannings has no column named ID_USE: , while compiling: INSERT INTO table_plannings(Titre, ID_ADE, ID_USE) VALUES(?, ?, ?); Ces '?' sont tout à fait normaux, cela est du à l'utilisation de PreparedStatement avec paramètres par Android, et c'est le résultat de l'appel à bd.insert() @G&Dev : effectivement, si tu as la possibilité de récupérer la base de données (soit depuis l'émulateur, soit depuis ton phone si tu es root), tu pourras l'ouvrir sur PC et voir réellement la structure de ta table) Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Gabin Posté(e) 2 mars 2011 Auteur Share Posté(e) 2 mars 2011 Je vais voir tout ça en détails et je vous tient au jus :P Merci à vous :) Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Gabin Posté(e) 2 mars 2011 Auteur Share Posté(e) 2 mars 2011 (modifié) Je me suis rendu compte qu'en fait ça marchait mais que la première fois. Et en fait c'était bête mais je demandais d'enregistrer mon planning avec un ID_USE = 98 et lorsque je cliquais à nouveau sur le bouton enregistrer, je ré-enregistrais mon planning avec et ID_USE = 98 mais je ne prenais pas le soin de le remplacer !! Du coup, lorsque j'appelais par la suite mon planning par son ID_USE=98 ça marchait pas... Enfin je pense que c'était ça parce que maintenant ça marche :) Un grand YES !! (une victoire de plus sur android :P) et encore merci les amis :emo_im_angel: Pour ceux qui aurait besoin du bout de code : Planning planSaveComp = new Planning( spos_Comp , sname_Comp , 98); Planning planSaveFil = new Planning(spos_Fil, sname_Fil, 99); planningbdd.open(); Log.i("BDD", "après open"); Planning booPlan98 = planningbdd.isExistIdUse(98); Planning booPlan99 = planningbdd.isExistIdUse(99); Log.i("BDD", "avant if"); if (booPlan98 != null) { Planning plan98 = planningbdd.getPlanningWithIdUse(98); planningbdd.updatePlanning(plan98.getId(),planSaveComp); Planning plan99 = planningbdd.getPlanningWithIdUse(99); planningbdd.updatePlanning(plan99.getId(), planSaveFil); } else { planningbdd.insertPlanning(planSaveComp); planningbdd.insertPlanning(planSaveFil); } planningbdd.close(); P.S: Je suis pas sur que le code soit très beau mais ça marche ! Sinon si vous souhaitez que je détail mes méthodes utilisées dans le code, mettez juste un petit message et je répondrais. Modifié 2 mars 2011 par G&Dev Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Recommended Posts
Rejoignez la conversation
Vous pouvez poster maintenant et vous enregistrez plus tard. Si vous avez un compte, connectez-vous maintenant pour poster.