Aller au contenu

plusieurs tables BDD SQlite


Recommended Posts

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é par derf42
Lien vers le commentaire
Partager sur d’autres sites

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é par moritan
Lien vers le commentaire
Partager sur d’autres sites

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é par derf42
Lien vers le commentaire
Partager sur d’autres sites

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...

Lien vers le commentaire
Partager sur d’autres sites

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...

Lien vers le commentaire
Partager sur d’autres sites

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 ?

Lien vers le commentaire
Partager sur d’autres sites

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...)

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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..

Lien vers le commentaire
Partager sur d’autres sites

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é par moritan
Lien vers le commentaire
Partager sur d’autres sites

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é par derf42
Lien vers le commentaire
Partager sur d’autres sites

 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+

Lien vers le commentaire
Partager sur d’autres sites

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...

Lien vers le commentaire
Partager sur d’autres sites

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...)

Lien vers le commentaire
Partager sur d’autres sites

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

 ...
}

Lien vers le commentaire
Partager sur d’autres sites

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

 ...
}

Lien vers le commentaire
Partager sur d’autres sites

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...)

Lien vers le commentaire
Partager sur d’autres sites

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é par derf42
Lien vers le commentaire
Partager sur d’autres sites

Rejoignez la conversation

Vous pouvez poster maintenant et vous enregistrez plus tard. Si vous avez un compte, connectez-vous maintenant pour poster.

Invité
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

×
×
  • Créer...