Aller au contenu

[Résolu] BDD SQLite - Error Inserting


Recommended Posts

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

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

Lien vers le commentaire
Partager sur d’autres sites

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)

Lien vers le commentaire
Partager sur d’autres sites

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é par G&Dev
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...