it-swarm.com.de

fehler in sqlite "DROP TABLE IF EXISTS" Android

ich habe also ein Problem in meiner DBAdapter-Klasse. Es zerquetscht nur, wenn ich die Datenbank zu öffnen versuche:

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

hier ist der fehler:

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

ich habe das Problem hervorgehoben, aber ich kann es nicht lösen: /

16
eli

Das Problem scheint mit dieser Aussage zu sein:

DROP TABLE IF EXISTS 122

dabei ist 122, wenn es wirklich der Name der zu löschenden Tabelle ist, nicht begrenzt (beispielsweise mit ') und kann daher nicht als Name behandelt werden. Aber der Parser erwartet dort einen Namen. Fügen Sie den Namen einfach in einfache oder doppelte Anführungszeichen ein und es sollte funktionieren:

db.execSQL("DROP TABLE IF EXISTS '" + DATABASE_TABLE + "'");
34
Andriy M

wenn der Tabellenname nur aus alphanumerischen Zeichen besteht, hätte Ihr ursprünglicher Code funktioniert. Da der Tabellenname nicht alles Alpha ist, muss er in einfache Anführungszeichen gesetzt werden.

2
johngray1965

db = Dies ist Ihre Datenbankhandlerklasse

db.execSQL("DROP TABLE IF EXISTS YourTableName");
0
Sathish Gadde

Ich denke, du vermisst ein ";" am Ende Ihrer SQL-Anweisung

Darüber hinaus habe ich gerade auf einer sqlite3-Konsole nachgesehen, es scheint, dass "122" ein ungültiger Tabellenname ist:

sqlite> drop table if exists 122;
Error: near "122": syntax error
sqlite> drop table if exists test;
sqlite> 
0
Hans Hohenfeld