Aller au contenu

Problème Base de donnée SQLite


Recommended Posts

Bonjour,

Dans le cadre d'une application que je développe, j'aimerais que les paramètres que l'utilisateur entre dans mon activité soit sauvegardés. Je suis parti sur une base de donnée dont voici mes codes :

package sosms.tzoreol.com;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;

public class SettingsDB {

//Constantes necessaire à la DB
private static final int DB_VERSION = 1;
private static final String DB_NAME = "settings.db";

private static final String SETTINGS_TABLE = "settings_table";

private static final String PHONE_NUMBER_COL = "phone_number";
private static final int PHONE_NUMBER_COL_ID = 0;

private static final String MESSAGE_COL = "message";
private static final int MESSAGE_COL_ID = 1;

private static final String DISPLAY_COL = "display";
private static final int DISPLAY_COL_ID = 2;

private static final String CLOSE_COL = "close";
private static final int CLOSE_COL_ID = 3;

//On déclare une DB
private SQLiteDatabase db;

//On déclare le helper
private SQLiteDB sqLiteDB;

//Constructeur
public SettingsDB(Context context){

	//On creé une DB
	sqLiteDB = new SQLiteDB(context, DB_NAME, null,  DB_VERSION);
}

public void open(){

	//Ouverture de la DB en écriture
	db = sqLiteDB.getWritableDatabase();
}

public void close(){

	//Fermeture de la DB
	db.close();
}

//Pour récupérer la DB
public SQLiteDatabase getDB(){

	return db;
}

//Pour modifier les settings
public int updateDB(String phoneNumber, String message, int display, int close){

	//On crée une ContentValues qui fonctionne comme une HashMap
	ContentValues values = new ContentValues();

	//On ajoute les valeurs
	values.put("phone_number", phoneNumber);
	values.put("message", message);
	values.put("display", display);
	values.put("close", close);

	//On modifie la table
	return db.update(SETTINGS_TABLE, values, null, null);
}

public Setting getSetting(){

	//On récupère les valeurs dans un curseur
	Cursor c = db.query(SETTINGS_TABLE, 
						new String[] {PHONE_NUMBER_COL, MESSAGE_COL, DISPLAY_COL, CLOSE_COL},
						null, null, null, null, null);

	return toSetting(c);
}

public Setting toSetting(Cursor c){

	//Renvoir null s'il n'y a rien dans le curseur
	if (c.getCount() == 0){
		return null;
	}
	else{

		c.moveToFirst();

		//On crée un Setting
		Setting setting = new Setting();

		//On lui affecte les valeurs du curseur
		setting.setPhoneNumber(c.getString(PHONE_NUMBER_COL_ID));
		setting.setMessage(c.getString(MESSAGE_COL_ID));
		setting.setDisplay(c.getInt(DISPLAY_COL_ID));
		setting.setClose(c.getInt(CLOSE_COL_ID));

		//Fermeture du curseur
		c.close();

		//On retourne le settings
		return setting;
	}
}
}

package sosms.tzoreol.com;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;

public class SQLiteDB extends SQLiteOpenHelper{

//On défini le nom de la table et des colonnes
private static final String SETTINGS_TABLE = "settings_table";

private static final String PHONE_NUMBER_COL = "phone_number";
private static final String MESSAGE_COL = "message";
private static final String DISPLAY_COL = "display";
private static final String CLOSE_COL = "close";

//Constante pour la creation de la DB
private static final String CREATE_DB = "CREATE TABLE " + SETTINGS_TABLE + "(" +
										PHONE_NUMBER_COL + " TEXT NOT NULL, " + 
										MESSAGE_COL + " TEXT NOT NULL, " + 
										DISPLAY_COL + " INTEGER NOT NULL, " +
										CLOSE_COL + " INTEGER NOT NULL);";

//Constructeur
public SQLiteDB(Context context, String name, CursorFactory factory, int version){

	super(context, name, factory, version);
}

@Override
public void onCreate(SQLiteDatabase db){

	//On crée la DB
	db.execSQL(CREATE_DB);
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion){

	//Pour modifier la DB, on efface l'ancienne et on en crée une nouvelle
	db.execSQL("DROP TABLE " + SETTINGS_TABLE + ";");
	onCreate(db);
}
}

package sosms.tzoreol.com;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;

public class SQLiteDB extends SQLiteOpenHelper{

//On défini le nom de la table et des colonnes
private static final String SETTINGS_TABLE = "settings_table";

private static final String PHONE_NUMBER_COL = "phone_number";
private static final String MESSAGE_COL = "message";
private static final String DISPLAY_COL = "display";
private static final String CLOSE_COL = "close";

//Constante pour la creation de la DB
private static final String CREATE_DB = "CREATE TABLE " + SETTINGS_TABLE + "(" +
										PHONE_NUMBER_COL + " TEXT NOT NULL, " + 
										MESSAGE_COL + " TEXT NOT NULL, " + 
										DISPLAY_COL + " INTEGER NOT NULL, " +
										CLOSE_COL + " INTEGER NOT NULL);";

//Constructeur
public SQLiteDB(Context context, String name, CursorFactory factory, int version){

	super(context, name, factory, version);
}

@Override
public void onCreate(SQLiteDatabase db){

	//On crée la DB
	db.execSQL(CREATE_DB);
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion){

	//Pour modifier la DB, on efface l'ancienne et on en crée une nouvelle
	db.execSQL("DROP TABLE " + SETTINGS_TABLE + ";");
	onCreate(db);
}
}

Quand je clique sur le bouton qui update les données, mon application plante avec cette erreur dans le LogCat :

05-04 08:12:55.657: ERROR/Database(284): Error updating close=1 message=ddd display=1 phone_numbel=555-555-5555 using UPDATE settings_table SET close=?, message=?, display=?, phone_number=?
05-04 08:12:55.667: DEBUG/AndroidRuntime(284): Shutting down VM
05-04 08:12:55.667: WARN/dalvikvm(284): threadid=3: thread exiting with uncaught exception (group=0x4001b188)
05-04 08:12:55.667: ERROR/AndroidRuntime(284): Uncaught handler: thread main exiting due to uncaught exception
05-04 08:12:55.720: ERROR/AndroidRuntime(284): android.database.sqlite.SQLiteException: no such column: close: , while compiling: UPDATE settings_table SET close=?, message=?, display=?, phone_number=?
05-04 08:12:55.720: ERROR/AndroidRuntime(284):     at android.database.sqlite.SQLiteProgram.native_compile(Native Method)
05-04 08:12:55.720: ERROR/AndroidRuntime(284):     at android.database.sqlite.SQLiteProgram.compile(SQLiteProgram.java:110)
05-04 08:12:55.720: ERROR/AndroidRuntime(284):     at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:59)
05-04 08:12:55.720: ERROR/AndroidRuntime(284):     at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:41)
05-04 08:12:55.720: ERROR/AndroidRuntime(284):     at android.database.sqlite.SQLiteDatabase.compileStatement(SQLiteDatabase.java:1027)
05-04 08:12:55.720: ERROR/AndroidRuntime(284):     at android.database.sqlite.SQLiteDatabase.updateWithOnConflict(SQLiteDatabase.java:1556)
05-04 08:12:55.720: ERROR/AndroidRuntime(284):     at android.database.sqlite.SQLiteDatabase.update(SQLiteDatabase.java:1500)
05-04 08:12:55.720: ERROR/AndroidRuntime(284):     at sosms.tzoreol.com.SettingsDB.updateDB(SettingsDB.java:72)
05-04 08:12:55.720: ERROR/AndroidRuntime(284):     at sosms.tzoreol.com.Settings$1$1.onClick(Settings.java:69)
05-04 08:12:55.720: ERROR/AndroidRuntime(284):     at com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:158)
05-04 08:12:55.720: ERROR/AndroidRuntime(284):     at android.os.Handler.dispatchMessage(Handler.java:99)
05-04 08:12:55.720: ERROR/AndroidRuntime(284):     at android.os.Looper.loop(Looper.java:123)
05-04 08:12:55.720: ERROR/AndroidRuntime(284):     at android.app.ActivityThread.main(ActivityThread.java:4363)
05-04 08:12:55.720: ERROR/AndroidRuntime(284):     at java.lang.reflect.Method.invokeNative(Native Method)
05-04 08:12:55.720: ERROR/AndroidRuntime(284):     at java.lang.reflect.Method.invoke(Method.java:521)
05-04 08:12:55.720: ERROR/AndroidRuntime(284):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
05-04 08:12:55.720: ERROR/AndroidRuntime(284):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
05-04 08:12:55.720: ERROR/AndroidRuntime(284):     at dalvik.system.NativeStart.main(Native Method)

Après avoir parcouru les sujets du forum, j'en est déduit qu'il y avait un problème lors de la création de ma base, mais je ne vois pas où.

J'ai aussi essayer de démarrer adb pour accéder à mes data, mais la fenêtre se ferme après quelques secondes de commandes automatiques.

Merci pour votre aide ;)

Lien vers le commentaire
Partager sur d’autres sites

Réutilise tes variables de classe (final static) que tu as utilisées pour créer ta table au lieu de réécrire "nomDeMaTable" dans tes ContentValues, ça peut éviter des erreurs

Ensuite, on ne connait pas le déroulement du dév de ton appli... est-ce que tu as rajouté la colonne close après ?

si c'est le cas, supprime et relance ton appli

Lien vers le commentaire
Partager sur d’autres sites

Si le besoin est juste de sauvegarder 4 valeurs de "configuration" de l'appli, l'utilisation d'une base de données pour ce faire est un peu hors de propos. L'utilisation des Preferences serait plus approprié et plus simple; cf doc

Lien vers le commentaire
Partager sur d’autres sites

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...