GetDatabase llamado recursivamente
Mi primera vez haciendo una pregunta aquí, así que ser gentil, Lol.
De todas formas. He estado trabajando en un Android y mi última versión funcionó perfectamente. Hasta ayer, cuando me dio una nueva estación de trabajo. Desde la obtención de esta nueva estación de trabajo, sigo recibiendo el siguiente error:
04-11 17:34:53.282: E/AndroidRuntime(789): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.blueharvest/com.example.blueharvest.SettingsActivity}: java.lang.IllegalStateException: getDatabase called recursively
Si ayuda, estoy ejecutando esto en un dispositivo virtual, utilizando la plataforma 4.2.2 y API nivel 17.
Realmente espero que alguien pueda arrojar algo de luz sobre este error, así que puedo dejar de arrancarme el pelo, Lol.
Si cualquier otra información es necesaria, por favor hágamelo saber.
Muchas gracias,
Puntilla.
EDIT: Añadido más del logcat
04-11 19:25:08.668: E/AndroidRuntime(2748): FATAL EXCEPTION: main 04-11 19:25:08.668: E/AndroidRuntime(2748): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.blueharvest/com.example.blueharvest.SettingsActivity}: java.lang.IllegalStateException: getDatabase called recursively 04-11 19:25:08.668: E/AndroidRuntime(2748): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180) 04-11 19:25:08.668: E/AndroidRuntime(2748): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230) 04-11 19:25:08.668: E/AndroidRuntime(2748): at android.app.ActivityThread.access$600(ActivityThread.java:141) 04-11 19:25:08.668: E/AndroidRuntime(2748): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234) 04-11 19:25:08.668: E/AndroidRuntime(2748): at android.os.Handler.dispatchMessage(Handler.java:99) 04-11 19:25:08.668: E/AndroidRuntime(2748): at android.os.Looper.loop(Looper.java:137) 04-11 19:25:08.668: E/AndroidRuntime(2748): at android.app.ActivityThread.main(ActivityThread.java:5041) 04-11 19:25:08.668: E/AndroidRuntime(2748): at java.lang.reflect.Method.invokeNative(Native Method) 04-11 19:25:08.668: E/AndroidRuntime(2748): at java.lang.reflect.Method.invoke(Method.java:511) 04-11 19:25:08.668: E/AndroidRuntime(2748): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 04-11 19:25:08.668: E/AndroidRuntime(2748): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 04-11 19:25:08.668: E/AndroidRuntime(2748): at dalvik.system.NativeStart.main(Native Method) 04-11 19:25:08.668: E/AndroidRuntime(2748): Caused by: java.lang.IllegalStateException: getDatabase called recursively 04-11 19:25:08.668: E/AndroidRuntime(2748): at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:204) 04-11 19:25:08.668: E/AndroidRuntime(2748): at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:164) 04-11 19:25:08.668: E/AndroidRuntime(2748): at com.example.blueharvest.DatabaseHandler.setDefaultLabel(DatabaseHandler.java:90) 04-11 19:25:08.668: E/AndroidRuntime(2748): at com.example.blueharvest.DatabaseHandler.onCreate(DatabaseHandler.java:82) 04-11 19:25:08.668: E/AndroidRuntime(2748): at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:252) 04-11 19:25:08.668: E/AndroidRuntime(2748): at android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:188) 04-11 19:25:08.668: E/AndroidRuntime(2748): at com.example.blueharvest.DatabaseHandler.populateFields(DatabaseHandler.java:196) 04-11 19:25:08.668: E/AndroidRuntime(2748): at com.example.blueharvest.SettingsActivity.onCreate(SettingsActivity.java:45) 04-11 19:25:08.668: E/AndroidRuntime(2748): at android.app.Activity.performCreate(Activity.java:5104) 04-11 19:25:08.668: E/AndroidRuntime(2748): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080) 04-11 19:25:08.668: E/AndroidRuntime(2748): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144) 04-11 19:25:08.668: E/AndroidRuntime(2748): ... 11 more
EDIT: Código añadido que causa el error. SetDefaultLabel () es el culpable.
@Override public void onCreate(SQLiteDatabase db) { // Create tables db.execSQL(CREATE_CATEGORIES_TABLE); db.execSQL(CREATE_CHRGDATA_TABLE); db.execSQL(CREATE_SETTINGS_TABLE); setDefaultLabel(); } /** * */ public void setDefaultLabel() { // create default label SQLiteDatabase db = this.getWritableDatabase(); ContentValues values = new ContentValues(); values.put(KEY_NAME, "Default"); db.insert(TABLE_LABELS, null, values); }
Intente cambiar el método setDefaultLabel()
para …
public void setDefaultLabel(SQLiteDatabase db)
… entonces en onCreate(...)
simplemente pasar el parámetro db
en él y deshacerse de esta línea …
SQLiteDatabase db = this.getWritableDatabase();
Tu código debería ser así …
@Override public void onCreate(SQLiteDatabase db) { // Create tables db.execSQL(CREATE_CATEGORIES_TABLE); db.execSQL(CREATE_CHRGDATA_TABLE); db.execSQL(CREATE_SETTINGS_TABLE); setDefaultLabel(db); } /** * */ public void setDefaultLabel(SQLiteDatabase db) { // create default label ContentValues values = new ContentValues(); values.put(KEY_NAME, "Default"); db.insert(TABLE_LABELS, null, values); }
El problema en su código existente es que onCreate(...)
se está pasando una referencia a la base de datos abierta / escritura, pero luego llama a setDefaultLabel(...)
que intenta obtener otra referencia grabable a la base de datos.
Aquí está mi solución para esto: En el ayudante, anulo 2 métodos getWritableDatabase () y getReadableDatabase () como abajo: Observe que usted no debe cerrar la base de datos, puede ser estrellado.
@Override public void onCreate(SQLiteDatabase db) { // All your code here ..... // Add default value for all tables isCreating = true; currentDB = db; generateAllDefaultData(); // release var isCreating = false; currentDB = null; } boolean isCreating = false; SQLiteDatabase currentDB = null; @Override public SQLiteDatabase getWritableDatabase() { // TODO Auto-generated method stub if(isCreating && currentDB != null){ return currentDB; } return super.getWritableDatabase(); } @Override public SQLiteDatabase getReadableDatabase() { // TODO Auto-generated method stub if(isCreating && currentDB != null){ return currentDB; } return super.getReadableDatabase(); }