Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


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:

  • Forma de anillo en android
  • Cláusula IN y marcadores de posición
  • Fragmento reemplazado aún visible
  • ANDROID: No se puede resolver el método getSupportActionBar ()
  • El desarrollo de Android cambia la visibilidad de TextView
  • Error de instalación: INSTALL_PARSE_FAILED_NO_CERTIFICATES
  • 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); } 

  • Android: Lista de certificados raíz de confianza disponibles
  • Android encuentra todas las cadenas codificadas en código con Android Studio
  • Android: la animación se acorta por la vista de los padres
  • ¡Stub de la mensajería del dispositivo de Amazon! Android Studio
  • Excepción aleatoria android.database.sqlite.SQLiteException: no se puede abrir el archivo de base de datos
  • Dilatación y erosión en Android
  • 2 Solutions collect form web for “GetDatabase llamado recursivamente”

    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.