Intento de volver a abrir un objeto ya cerrado: java.lang.IllegalStateException :?
Sé que esta pregunta ha pedido muchas veces en SO, pero no pude averiguar mi problema exacto.
Estoy utilizando el siguiente código para obtener los datos de la base de datos (Table1) y actualizar otro Table2 basado en el valor de recuperación. Su funcionamiento muy bien en algunas versiones de Android, pero cuando me fui a la prueba con Android 4.0.3. Estoy recibiendo este java.lang.IllegalStateException:?.attempt to re-open an already-closed object
en sum_cursor.moveToNext();
.
- IllegalStateException con PagerAdapter
- "No se puede realizar esta acción después de onSaveInstanceState" - ¿por qué recibo esta excepción del método onResume de mi actividad?
- IllegalStateException cuando .replace el fragmento al reiniciar
- Android GoogleMaps V2 MarkerDemo IllegalStateException no incluye puntos
- java.lang.IllegalStateException (No se puede realizar esta acción después de onSaveInstanceState)
Estoy utilizando este código en AsyncTask.
/** Sum of total matched values*/ Cursor sum_cursor = db.gettotalMatchvalue(this); if(sum_cursor!=null) { sum_cursor.moveToFirst(); for(int j=0; j<sum_cursor.getCount();j++) { float totalmatchedscore = sum_cursor.getInt(0); float totalingredients = Float.parseFloat(sum_cursor.getString(sum_cursor.getColumnIndex(APPDatabase.CK_TOTALINCREDIENTS))); /**average = totalscore/totalingredients*/ double average = totalmatchedscore/totalingredients; int id = Integer.parseInt(sum_cursor.getString(sum_cursor.getColumnIndex(APPDatabase.CK_ID))); db.updateAverage(id, average); sum_cursor.moveToNext(); //Here is the problem } } db.close();
Mi codificación de método de actualización
/** Update average */ public void updateAverage(int id,double average) { SQLiteDatabase db = getWritableDatabase(); ContentValues values = new ContentValues(); values.put(CK_FINALVALUE,average); db.update(TABLE, values,CK_ID+" = "+id , null); }
¿Qué estoy haciendo mal aquí?
Sé que muchos de ustedes se encuentran con esta situación. Podrías ayudarme chicos.
Gracias por tu ayuda.
- Java.lang.IllegalStateException: Fragmento no adjunto a la actividad
- Android: no se puede destruir la actividad después de terminar, causada por IllegalStateException: No se puede realizar esta acción después de onSaveInstanceState
- java.lang.IllegalStateException: Llamar Ver métodos en otro subproceso que el subproceso de interfaz de usuario
- OnViewCreated - lugar equivocado para reemplazar el fragmento?
- Java.lang.IllegalStateException: No se puede realizar esta acción después de onSaveInstanceState, FragmentTabHost
- Excepción de estado ilegal al intentar cambiar un marcador en un Api de Google Maps v2 desde un mensaje de Google Cloud Messaging
- En Facturación de aplicaciones - Orientación rápida de dispositivos - causa bloqueo (IllegalStateException)
- Haga clic en el elemento que conduce a IllegalStateException
No puede actualizar una tabla mientras itera sobre los resultados de una consulta. Hay buenas razones para esto; ¿Qué pasa si los datos que está agregando provocarían un cambio en los datos que está iterando? Su cursor no devolverá datos válidos.
Intentar almacenar datos de nuevo en la tabla en updateAverage()
está causando el problema. Sólo debe recordar el valor promedio durante su bucle, y luego actualizar una vez al final después de haber terminado de bucle sobre el cursor.
Para explicar el error exacto que está recibiendo: el acto de insertar nuevos datos está causando que la base de datos cierre todos los cursores que están abiertos actualmente, como una medida de seguridad. Así que cuando llamas a sum_cursor.moveToNext()
después de actualizar el promedio, el cursor está un poco sorprendido al descubrir que ya está cerrado.
¿Qué pasa si comenta out db.updateAverage(id, average)
?
Puede alcanzar su meta con SQL puro es más rápido y mejor desde el punto de vista de la arquitectura porque toda la lógica estará en una transacción SQL
REPLACE INTO table_where_to_put SELECT *, (totalmatchedscore/totalingredients) as average FROM table_with_input_data
Usar REPLACE O UPDATE
- Anular el registro de un dispositivo de GCM mediante la identificación de registro en Android
- Adjuntar estilo CardView personalizado al tema