j'ai donc un problème dans ma classe DBAdapter, il écrase simplement lorsque j'essaie d'ouvrir la base de données:
public void onUpgrade(SQLiteDatabase db, int oldVersion,
int newVersion)
{
Log.w("SingleDBAdapter", "Upgrading database from version " + oldVersion
+ " to "
+ newVersion + ", which will destroy all old data");
db.execSQL("DROP TABLE IF EXISTS "+DATABASE_TABLE);
onCreate(db);
}
}
voici l'erreur:
07-28 11:32:49.443: E/Database(1244): Failure 1 (near "122": syntax error) on 0x2435b0 when preparing 'DROP TABLE IF EXISTS 122'.
07-28 11:32:49.463: D/AndroidRuntime(1244): Shutting down VM
07-28 11:32:49.463: W/dalvikvm(1244): threadid=1: thread exiting with uncaught exception (group=0x4001d800)
07-28 11:32:49.473: E/AndroidRuntime(1244): FATAL EXCEPTION: main
07-28 11:32:49.473: E/AndroidRuntime(1244): Java.lang.RuntimeException: Unable to start activity ComponentInfo{com.shop.list/com.shop.list.main}: Android.database.sqlite.SQLiteException: near "122": syntax error: **DROP TABLE IF EXISTS 122**
07-28 11:32:49.473: E/AndroidRuntime(1244): at Android.app.ActivityThread.performLaunchActivity(ActivityThread.Java:2663)
07-28 11:32:49.473: E/AndroidRuntime(1244): at Android.app.ActivityThread.handleLaunchActivity(ActivityThread.Java:2679)
07-28 11:32:49.473: E/AndroidRuntime(1244): at Android.app.ActivityThread.access$2300(ActivityThread.Java:125)
07-28 11:32:49.473: E/AndroidRuntime(1244): at Android.app.ActivityThread$H.handleMessage(ActivityThread.Java:2033)
07-28 11:32:49.473: E/AndroidRuntime(1244): at Android.os.Handler.dispatchMessage(Handler.Java:99)
07-28 11:32:49.473: E/AndroidRuntime(1244): at Android.os.Looper.loop(Looper.Java:123)
07-28 11:32:49.473: E/AndroidRuntime(1244): at Android.app.ActivityThread.main(ActivityThread.Java:4627)
07-28 11:32:49.473: E/AndroidRuntime(1244): at Java.lang.reflect.Method.invokeNative(Native Method)
07-28 11:32:49.473: E/AndroidRuntime(1244): at Java.lang.reflect.Method.invoke(Method.Java:521)
07-28 11:32:49.473: E/AndroidRuntime(1244): at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:868)
07-28 11:32:49.473: E/AndroidRuntime(1244): at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:626)
07-28 11:32:49.473: E/AndroidRuntime(1244): at dalvik.system.NativeStart.main(Native Method)
07-28 11:32:49.473: E/AndroidRuntime(1244): Caused by: Android.database.sqlite.SQLiteException: near "122": syntax error: DROP TABLE IF EXISTS 122
07-28 11:32:49.473: E/AndroidRuntime(1244): at Android.database.sqlite.SQLiteDatabase.native_execSQL(Native Method)
07-28 11:32:49.473: E/AndroidRuntime(1244): at Android.database.sqlite.SQLiteDatabase.execSQL(SQLiteDatabase.Java:1727)
07-28 11:32:49.473: E/AndroidRuntime(1244): at com.shop.list.ListDBAdapter$DatabaseHelper.onUpgrade(ListDBAdapter.Java:51)
07-28 11:32:49.473: E/AndroidRuntime(1244): at Android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.Java:108)
07-28 11:32:49.473: E/AndroidRuntime(1244): at com.shop.list.ListDBAdapter.open(ListDBAdapter.Java:60)
07-28 11:32:49.473: E/AndroidRuntime(1244): at com.shop.list.main.onCreate(main.Java:60)
07-28 11:32:49.473: E/AndroidRuntime(1244): at Android.app.Instrumentation.callActivityOnCreate(Instrumentation.Java:1047)
07-28 11:32:49.473: E/AndroidRuntime(1244): at Android.app.ActivityThread.performLaunchActivity(ActivityThread.Java:2627)
07-28 11:32:49.473: E/AndroidRuntime(1244): ... 11 more
j'ai souligné le problème mais je ne peux pas le résoudre: /
Le problème semble être avec cette déclaration:
DROP TABLE IF EXISTS 122
où 122
, s'il s'agit vraiment du nom de la table à supprimer, n'est pas délimité (avec '
, par exemple) et ne peut donc pas être traité comme un nom. Mais l'analyseur attend un nom là-bas. Il suffit de mettre le nom entre guillemets simples ou doubles, et cela devrait fonctionner:
db.execSQL("DROP TABLE IF EXISTS '" + DATABASE_TABLE + "'");
si le nom de la table était composé uniquement de caractères alpha, votre code d'origine aurait fonctionné. Comme le nom de la table n’est pas entièrement alpha, il doit être entouré de guillemets simples.
db = Ceci est votre classe de gestionnaire de base de données
db.execSQL("DROP TABLE IF EXISTS YourTableName");
Je pense que votre manque un ';' à la fin de votre instruction SQL
Au-delà de cela, je viens de vérifier sur une console sqlite3, il semble que "122" soit un nom de table non valide:
sqlite> drop table if exists 122;
Error: near "122": syntax error
sqlite> drop table if exists test;
sqlite>