Tzoreol Posté(e) 4 mai 2011 Share Posté(e) 4 mai 2011 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 More sharing options...
Sakaroz Posté(e) 4 mai 2011 Share Posté(e) 4 mai 2011 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 More sharing options...
chpil Posté(e) 4 mai 2011 Share Posté(e) 4 mai 2011 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 More sharing options...
Tzoreol Posté(e) 4 mai 2011 Auteur Share Posté(e) 4 mai 2011 Ça s'est résolu en retirant les Toast, mais je ne sais pas pourquoi. @Chpil : Merci, je vais essayer les préférences, c'est probablement mieux ;-) Lien vers le commentaire Partager sur d’autres sites More sharing options...
Recommended Posts
Archivé
Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.