derf42 Posté(e) 14 avril 2011 Share Posté(e) 14 avril 2011 (modifié) Bonjour, Je suis en cours de developpement d'une appli android qui nécessite une base de donnée SQLite. Mon problème est le suivant : j'ai une classe DataHelper qui gere ma table avec les classe SQLiteOpenHelper, SQLiteDataBase... j'ai créé deux tables en faisant un execSQL: db.execSQL("CREATE TABLE " + TABLE_NAME + "(_id INTEGER PRIMARY KEY, name TEXT)"); db.execSQL("CREATE TABLE " + TABLE_NAME_MSG_PREDEF + "(_id INTEGER PRIMARY KEY, msg TEXT)"); Mon soucis est que je n'arrive pas a inseré des éléments dans cette table, j'ai une methode insert() : private static final String INSERT = "insert into " + TABLE_NAME + "(name) values (?)"; this.insertStmt = this.db.compileStatement(INSERT); public long insert(String name) { this.insertStmt.bindString(1, name); return this.insertStmt.executeInsert(); } Cette methode insert(String name) est donc pour inserer des éléments dans la première table ("TABLE_NAME"). J'aimerais donc pouvoir creer une deuxiemen methode insert() pour inserer des éléments dans la deuxieme table ("TABLE_NAME_MSG_PREDEF"). J'ai deja essayé de faire : private static final String INSERT_MSG_PREDEF = "insert into " + TABLE_NAME_MSG_PREDEF + "(msg) values (?)"; this.insertStmt = this.db.compileStatement(INSERT_MSG_PREDEF); public long insert_msg(String msg) { this.insertStmt.bindString(1, msg); return this.insertStmt.executeInsert(); } Mais ça plante directement a lla creation de la base. Merci de m'aider Modifié 14 avril 2011 par derf42 Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
moritan Posté(e) 14 avril 2011 Share Posté(e) 14 avril 2011 (modifié) Si tu nous donnais ta pile d'erreur ça serait mieux pour identifier le problème. Tu colles tes 2 requêtes d'insertion dans le même paramètre , il doit pas aimé, sans oublié que l'endroit ou tu fait ta déclaration est bizarre, tu as fait un copier coller de ton code ? si oui ce n'est pas bon. tu ne peux par faire "this.mavariable" en dehors d'une méthode. Modifié 14 avril 2011 par moritan Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
chpil Posté(e) 14 avril 2011 Share Posté(e) 14 avril 2011 Et qu'est-ce qui se passe exactement ? Tu as des logs ? une trace de l'exception qui se produit ? Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
derf42 Posté(e) 18 avril 2011 Auteur Share Posté(e) 18 avril 2011 (modifié) Bonjour, excusez moi du temps de reaction (pas dispo ce weekend). Il y a bien une erreur dans le code que j'ai donné précedemment : premièrement les this.insert... sont bien fait dans une methode (constructeur de ma classe). Les execSQL() sont dans le onCreate().. Il est vrai que dans le code que je code 2 requete d'insertion dans insertStmt.. Je corrige: Déclaration de mes deux SQLStatement : private SQLiteStatement insertStmt; private SQLiteStatement insertStmtmsgpredef; Dans le constructeur je fais bien : this.insertStmt = this.db.compileStatement(INSERT); this.insertStmtmsgpredef = this.db.compileStatement(INSERTMSGPREDEF); et ma methode d'insertion dans ma deuxieme table est codée ainsi : public long insert_msg_predef(String msg) { this.insertStmtmsgpredef.bindString(1, msg); return this.insertStmtmsgpredef .executeInsert(); } Je vais voir pour les logs d'erreur cet apres midi.. Merci de votre aide Modifié 18 avril 2011 par derf42 Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
derf42 Posté(e) 18 avril 2011 Auteur Share Posté(e) 18 avril 2011 voici mon log d'erreur : 04-18 13:01:32.259: ERROR/AndroidRuntime(1139): Uncaught handler: thread main exiting due to uncaught exception 04-18 13:01:32.293: ERROR/AndroidRuntime(1139): java.lang.RuntimeException: Unable to start activity ComponentInfo{fr.IHM2/fr.IHM2.AbsenceActivity}: android.database.sqlite.SQLiteException: no such table: msgpredef: , while compiling: insert into msgpredef(msg) values (?) 04-18 13:01:32.293: ERROR/AndroidRuntime(1139): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2496) 04-18 13:01:32.293: ERROR/AndroidRuntime(1139): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2512) 04-18 13:01:32.293: ERROR/AndroidRuntime(1139): at android.app.ActivityThread.access$2200(ActivityThread.java:119) 04-18 13:01:32.293: ERROR/AndroidRuntime(1139): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1863) 04-18 13:01:32.293: ERROR/AndroidRuntime(1139): at android.os.Handler.dispatchMessage(Handler.java:99) 04-18 13:01:32.293: ERROR/AndroidRuntime(1139): at android.os.Looper.loop(Looper.java:123) 04-18 13:01:32.293: ERROR/AndroidRuntime(1139): at android.app.ActivityThread.main(ActivityThread.java:4363) 04-18 13:01:32.293: ERROR/AndroidRuntime(1139): at java.lang.reflect.Method.invokeNative(Native Method) 04-18 13:01:32.293: ERROR/AndroidRuntime(1139): at java.lang.reflect.Method.invoke(Method.java:521) 04-18 13:01:32.293: ERROR/AndroidRuntime(1139): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860) 04-18 13:01:32.293: ERROR/AndroidRuntime(1139): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) 04-18 13:01:32.293: ERROR/AndroidRuntime(1139): at dalvik.system.NativeStart.main(Native Method) 04-18 13:01:32.293: ERROR/AndroidRuntime(1139): Caused by: android.database.sqlite.SQLiteException: no such table: msgpredef: , while compiling: insert into msgpredef(msg) values (?) 04-18 13:01:32.293: ERROR/AndroidRuntime(1139): at android.database.sqlite.SQLiteProgram.native_compile(Native Method) 04-18 13:01:32.293: ERROR/AndroidRuntime(1139): at android.database.sqlite.SQLiteProgram.compile(SQLiteProgram.java:110) 04-18 13:01:32.293: ERROR/AndroidRuntime(1139): at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:59) 04-18 13:01:32.293: ERROR/AndroidRuntime(1139): at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:41) 04-18 13:01:32.293: ERROR/AndroidRuntime(1139): at android.database.sqlite.SQLiteDatabase.compileStatement(SQLiteDatabase.java:1027) 04-18 13:01:32.293: ERROR/AndroidRuntime(1139): at fr.IHM2.GestionBDD.<init>(GestionBDD.java:40) 04-18 13:01:32.293: ERROR/AndroidRuntime(1139): at fr.IHM2.AbsenceActivity.onCreate(AbsenceActivity.java:69) 04-18 13:01:32.293: ERROR/AndroidRuntime(1139): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 04-18 13:01:32.293: ERROR/AndroidRuntime(1139): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2459) 04-18 13:01:32.293: ERROR/AndroidRuntime(1139): ... 11 more J'ai bien compris que le soucis venait de mon deuxieme compileStatement "this.insertStmtmsgpredef = this.db.compileStatement(INSERTMSGPREDEF);" Mais comment faire autrement... Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
derf42 Posté(e) 18 avril 2011 Auteur Share Posté(e) 18 avril 2011 personne pour m'aider? Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
derf42 Posté(e) 18 avril 2011 Auteur Share Posté(e) 18 avril 2011 la déclaration de mes variables d'intertion : private static final String INSERT = "insert into " + TABLE_NAME + "(name) values (?)"; private static final String INSERTMSGPREDEF = "insert into " + TABLE_NAME_MSG_PREDEF + "(msg) values (?)"; Aucun soucis pour la première mais la deuxieme ne passe pas... Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
chpil Posté(e) 18 avril 2011 Share Posté(e) 18 avril 2011 L'erreur que tu indiques montre que l'insertion ne se passe pas, car il ne trouve pas la table msgpredef. Cela voudrait dire que cette table n'a pas été créée dans la base. Es-tu sûr que cette table existe bien ? Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
derf42 Posté(e) 18 avril 2011 Auteur Share Posté(e) 18 avril 2011 Elle existe car cela fonctionne avec la première table quand je ne met pas la deuxieme, l'appli plante quand j'essaye de créer une deuxieme table.. Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
chpil Posté(e) 18 avril 2011 Share Posté(e) 18 avril 2011 Et tu as une erreur lors de la création de la table en question ?? (parce que l'erreur que tu donnes, c'est celle lors de l'insertion, erreur qui est peut-être logique si la table n'existe pas...) Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
derf42 Posté(e) 18 avril 2011 Auteur Share Posté(e) 18 avril 2011 C'est vrai ça pourrait etre ça mais je fais un CREATE TABLE de ma nouvelle table sans soucis pourtant il ne la trouve pas... Je n'arrive pas a débuger pas à pas avec eclipse donc je ne peux pas dire ce qu'il se passe vraiment mais mon appli ne plante pas et la première table ainsi que ses insert fonctionnent très bien Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
derf42 Posté(e) 19 avril 2011 Auteur Share Posté(e) 19 avril 2011 Bon alors j'abandonne cette solution, j'ai décidé de créer une autre classe pour creer et gerer une autre base qui a une table. Donc pour chaque nouvelle table je devrais creer une nouvelle base.. Solution très peu pratique et assez lourde mais c'est bien la seule qui fonctionne pour moi.. Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
moritan Posté(e) 19 avril 2011 Share Posté(e) 19 avril 2011 (modifié) il n'y a pas de raison pour que tu ne puisses pas avoir plusieurs tables. Reprend ton code du début et vérifie que tu n'as pas de trace d'erreur dans tes logs. Vérifie aussi que tu n'as pas trappé une erreur dans un try catch et que celle-ci n’apparaît pas dans ton logcat. Ta solution d'une seconde base n'en est pas une. tu vas juste déplacé le problème. Vérifie que le nom que tu mets dans ta variable TABLE_NAME_MSG_PREDEF est bien un nom valide on voit des ':' dans les logs mais c'est peut-être juste dans les logs. Modifié 19 avril 2011 par moritan Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
derf42 Posté(e) 19 avril 2011 Auteur Share Posté(e) 19 avril 2011 (modifié) L'erreur dans mes logs est bien explicite ci dessus, ma requete d'insertion ne passe pas car il ne trouve pas la table en question. J'ai passé et repassé mon code au peigne fin sans y trouver un erreur. Pour les " : " dans les logs je l'ai vu aussi mais voici la déclaration du nom de ma table : private static final String TABLE_NAME_MSG_PREDEF = "msg01"; Donc le probleme ne viens pas de la, c'est bien le log qui abuse des " : "... Pour ce qui est de ma solution elle fonctionne très bien etant donné que mes tables ne sont pas liées, le soucis c'est effectivement que je crée 2 bases pour 2 tables au lieu de 1 base pour 2 tables.. Donc plus lourd mais ça fonctionne. J'aimerais bien tout de même arriver a creer une seule base avec plusieurs tables, je vais donc tout re-tester séparément une nouvelle fois... Modifié 19 avril 2011 par derf42 Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
CoD Posté(e) 20 avril 2011 Share Posté(e) 20 avril 2011 db.execSQL("CREATE TABLE " + TABLE_NAME + "(_id INTEGER PRIMARY KEY, name TEXT)"); db.execSQL("CREATE TABLE " + TABLE_NAME_MSG_PREDEF + "(_id INTEGER PRIMARY KEY, msg TEXT)"); Mon soucis est que je n'arrive pas a inseré des éléments dans cette table, j'ai une methode insert() : private static final String INSERT = "insert into " + TABLE_NAME + "(name) values (?)"; this.insertStmt = this.db.compileStatement(INSERT); public long insert(String name) { this.insertStmt.bindString(1, name); return this.insertStmt.executeInsert(); } Juste pour participer. Il ne manquerait pas un espace entre TABLE_NAME et la parenthèse dans la construction des tes requêtes ? comme ça db.execSQL("CREATE TABLE " + TABLE_NAME + " (_id INTEGER PRIMARY KEY, name TEXT)"); et comme ça private static final String INSERT = "insert into " + TABLE_NAME + " (name) values (?)"; ça pourrait peut-être arranger les choses. A+ Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
derf42 Posté(e) 21 avril 2011 Auteur Share Posté(e) 21 avril 2011 Merci CoD mais le soucis ne viens pas de la syntaxe de mes requetes. La première requete fonctoionne etant donné que l'on peut très bien acceder a la table et y inserer des elements. Mon soucis est quand on en créée une seconde. Apparament personne n'a créé plusieurs tables avec SQLite ici... Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
chpil Posté(e) 21 avril 2011 Share Posté(e) 21 avril 2011 Apparament personne n'a créé plusieurs tables avec SQLite ici... C'est plutôt que personne n'a rencontré TON problème ;) (perso, je dois avoir 5 tables dans une base, et aucun problème...) Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
derf42 Posté(e) 21 avril 2011 Auteur Share Posté(e) 21 avril 2011 chpil as-tu créée tes deux tables dans la meme base et dans une meme classe? Si oui pourrais-tu mettre le bout de code de la creation et de la methode d'insertion de ta base stp.. Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
derf42 Posté(e) 21 avril 2011 Auteur Share Posté(e) 21 avril 2011 J'ai entendu parler de "transaction", que SQLite est bloqué en ecriture lorsqu'on travaille dessu. Pourrait-il y avoir un lien avec mon soucis?? Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
chpil Posté(e) 21 avril 2011 Share Posté(e) 21 avril 2011 J'ai entendu parler de "transaction", que SQLite est bloqué en ecriture lorsqu'on travaille dessu. Pourrait-il y avoir un lien avec mon soucis?? Si tu n'utilises pas explicitement les transactions, ça ne doit pas te concerner chpil as-tu créée tes deux tables dans la meme base et dans une meme classe? Si oui pourrais-tu mettre le bout de code de la creation et de la methode d'insertion de ta base stp.. Je n'ai pas mon code sous la main, mais cela ressemble à tes extraits de code: - une classe DatabaseHelper, avec la création des tables dans la méthode onCreate de la même façon que ce que tu fais - une classe MaDatabase, qui s'appuie sur DatabaseHelper pour récupérer la database (getWritableDatabase), et qui propose une méthode par requête fonctionnelle à implémenter (insertions, suppressions, recherches, ... DatabaseHelper public class DatabaseHelper extentds SQLiteOpenHelper { private static final int DB_VERSION = 1; private static final String DB_NAME = "maDB"; private static final String CREATE_TABLE1 = "create table table1 (....)"; private static final String CREATE_TABLE2 = ... public DatabaseHelper(Context context) { super(context, DB_NAME, null, DB_VERSION); } public void onCreate(SQLiteDatabase db) { db.execSQL(CREATE_TABLE1); db.execSQL(CREATE_TABLE2); ... } } MaDatabase public class MaDatabase { private DatabaseHelper dbHelper; private SQLiteDatabase db; private SQLiteStatement insertStmt1; ... public MaDatabase(Context context) { dbHelper = new DatabaseHelper(context); } public void openDatabase() { db = dbHelper.getWritableDatabase(); insertStmt1 = db.compileStatement( "insert into ..."); } public void closeDatabase() { db.close(); } public void insererElement(...) { insertStmt1.bindString(...); insertStmt1.execute(); } ... } Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
derf42 Posté(e) 21 avril 2011 Auteur Share Posté(e) 21 avril 2011 Merci, peux tu détailler ta requete "insert into", du coup tu en as besoin de deux??? Si tu n'utilises pas explicitement les transactions, ça ne doit pas te concerner Je n'ai pas mon code sous la main, mais cela ressemble à tes extraits de code: - une classe DatabaseHelper, avec la création des tables dans la méthode onCreate de la même façon que ce que tu fais - une classe MaDatabase, qui s'appuie sur DatabaseHelper pour récupérer la database (getWritableDatabase), et qui propose une méthode par requête fonctionnelle à implémenter (insertions, suppressions, recherches, ... DatabaseHelper public class DatabaseHelper extentds SQLiteOpenHelper { private static final int DB_VERSION = 1; private static final String DB_NAME = "maDB"; private static final String CREATE_TABLE1 = "create table table1 (....)"; private static final String CREATE_TABLE2 = ... public DatabaseHelper(Context context) { super(context, DB_NAME, null, DB_VERSION); } public void onCreate(SQLiteDatabase db) { db.execSQL(CREATE_TABLE1); db.execSQL(CREATE_TABLE2); ... } } MaDatabase public class MaDatabase { private DatabaseHelper dbHelper; private SQLiteDatabase db; private SQLiteStatement insertStmt1; ... public MaDatabase(Context context) { dbHelper = new DatabaseHelper(context); } public void openDatabase() { db = dbHelper.getWritableDatabase(); insertStmt1 = db.compileStatement( "insert into ..."); } public void closeDatabase() { db.close(); } public void insererElement(...) { insertStmt1.bindString(...); insertStmt1.execute(); } ... } Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
chpil Posté(e) 21 avril 2011 Share Posté(e) 21 avril 2011 Oui, autant de statement et autant de méthodes qu'il de tables/de type de données à insérer (mais je n'ai pas utilisé les compiledstatement, mais la méthode SQLiteDatabase.insert, ce qui ne change rien; et puis ton problème est lié à la création des tables de la base, pas à l'insertion de données dans la base...) Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
derf42 Posté(e) 21 avril 2011 Auteur Share Posté(e) 21 avril 2011 Mon problème est deja qu'il est impossible de faire plusieurs compileStatement, ça plante en partie à cause de ça... Mes create tables sont bien codés c'est ça qui me parait bizarre.. Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
chpil Posté(e) 21 avril 2011 Share Posté(e) 21 avril 2011 Comment ça, tu ne peux pas faire plusieurs compileStatement ? Tu n'avais pas parlé de cette erreur. C'est nouveau ? Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
derf42 Posté(e) 21 avril 2011 Auteur Share Posté(e) 21 avril 2011 (modifié) voici mon code : private static final String DATABASE_NAME = "msgpredef.db"; private static final int DATABASE_VERSION = 1; private static final String TABLE_NAME_MSG_PREDEF = "msg01"; private static final String TABLE_NAME = "table1"; private Context context; public SQLiteDatabase db; private SQLiteStatement insertStmt; private SQLiteStatement insertStmtmsgpredef; private static final String INSERT = "insert into " + TABLE_NAME + " (name) values (?)"; private static final String INSERTMSGPREDEF = "insert into " + TABLE_NAME_MSG_PREDEF + "(msg) values (?)"; public GestionBDDMsgPredef(Context context) { this.context = context; CreerBDDMsgPredef openHelper = new CreerBDDMsgPredef(this.context); this.db = openHelper.getWritableDatabase(); //this.insertStmt = this.db.compileStatement(INSERT); this.insertStmtmsgpredef = this.db.compileStatement(INSERTMSGPREDEF); } public long insert(String name) { this.insertStmt.bindString(1, name); return this.insertStmt.executeInsert(); } public long insert_msg_predef(String msg) { this.insertStmtmsgpredef.bindString(1, msg); return this.insertStmtmsgpredef.executeInsert(); } Si j'enleve le commentaire qui est sur le compilStatement, ça plante. Et la bien entendu seul la première table se remplie.. Modifié 21 avril 2011 par derf42 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.