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(); } 
FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.