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(); .

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.

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

  • Añadir pestañas a la izquierda con FragmentPagerAdapter
  • Android.media.audiofx.Visualizer lanzando excepción cada otra vez
  • GetSupportFragmentManager () causa java.lang.IllegalStateException: No se puede realizar esta acción después de onSaveInstanceState
  • Android - SQLite Cursor getColumnIndex () es sensible a mayúsculas y minúsculas?
  • Fragmento inflado en Fragmento El cuadro de diálogo arroja el error "Fragmento no creó una vista"
  • Java.lang.IllegalStateException: No se puede realizar esta acción después de onSaveInstanceState
  • IllegalStateException en FragmentManager
  • AudioTrack: play () llamado en AudioTrack no inicializado
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.