Подтвердить что ты не робот

Ошибка в sqlite "DROP TABLE IF EXISTS" android

поэтому у меня есть проблема в моем классе DBAdapter, когда он просто распаковывается, когда я пытаюсь открыть базу данных: из LogCat я думаю, проблема в функции onUpgrade:

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

вот ошибка:

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

я выделил проблему, но я не могу ее решить:/

4b9b3361

Ответ 1

Проблема заключается в следующем:

DROP TABLE IF EXISTS 122

где 122, если это действительно имя таблицы, которое нужно удалить, не разделяется (например, ') и, следовательно, не может рассматриваться как имя. Но парсер ожидает там своего имени. Просто укажите имя в одиночных или двойных кавычках, и оно должно работать:

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

Ответ 2

если имя таблицы было всего альфа-символом, ваш исходный код работал бы. Поскольку имя таблицы не является всей альфой, оно должно быть окружено одинарными кавычками.

Ответ 3

Я думаю, что ваш недостающий ';' в конце вашего оператора SQL

Помимо того, что я просто проверил на консоли sqlite3, похоже, что "122" является недопустимым именем таблицы:

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

Ответ 4

db = Это класс обработчика базы данных

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

Ответ 5

Привет. Думаю, вам следует использовать вызов: "Context.deleteDatabase(DATABASE_NAME);"

перед вызовом функции onCreate(); "

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");
       context.deleteDatabase(DATABASE_NAME);
       onCreate(db);
  }
 }

Ответ 6

Вы должны изменить свой:

db.execSQL("DROP TABLE IF EXISTS "+DATABASE_TABLE);

с:

db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE + ";");

Кроме того, вам нужно проверить, если newVersion > oldVersion