android - drop - sqlite truncate table
error en sqlite "DROP TABLE IF EXISTS" de Android (6)
así que tengo un problema en mi clase DBAdapter que simplemente se aplasta cuando intento abrir la base de datos: desde el LogCat supongo que el problema está en la función 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);
}
}
Aquí está el error:
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
Resalté el problema pero no puedo resolverlo: /
Creo que te falta un '';'' al final de su declaración SQL
Más allá de que acabo de verificar en una consola sqlite3, parece que "122" es un nombre de tabla no válido:
sqlite> drop table if exists 122;
Error: near "122": syntax error
sqlite> drop table if exists test;
sqlite>
Debes cambiar tu:
db.execSQL("DROP TABLE IF EXISTS "+DATABASE_TABLE);
con:
db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE + ";");
Además, debes comprobar si newVersion> oldVersion
El problema parece estar con esta afirmación:
DROP TABLE IF EXISTS 122
donde 122
, si realmente es el nombre de la tabla que se va a descartar, no está delimitado (con ''
, por ejemplo) y, por lo tanto, no puede tratarse como un nombre. Pero el analizador espera un nombre allí. Simplemente incluya el nombre entre comillas simples o dobles, y debería funcionar:
db.execSQL("DROP TABLE IF EXISTS ''" + DATABASE_TABLE + "''");
Hola, creo que deberías usar llamar a la instrucción: "context.deleteDatabase (DATABASE_NAME);"
antes de la llamada de "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);
}
}
Si el nombre de la tabla fuera todos los caracteres alfa, su código original hubiera funcionado. Dado que el nombre de la tabla no es todo alfa, debe estar rodeado de comillas simples.
db = Esta es su clase de manejador de base de datos
db.execSQL("DROP TABLE IF EXISTS YourTableName");