13

Sé que esta pregunta se ha hecho muchas veces en SO, pero no pude resolver mi problema exacto.Intento de volver a abrir un objeto ya cerrado: java.lang.IllegalStateException :?

Estoy usando el siguiente código para obtener los datos de la base de datos (Tabla 1) y actualizar otra Tabla2 en función del valor de recuperación. Está funcionando bien en algunas versiones de Android, pero cuando fui a probar con Android 4.0.3. Estoy obteniendo este java.lang.IllegalStateException:?.attempt to re-open an already-closed object en sum_cursor.moveToNext();.

Estoy usando 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 método de actualización de codificació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); 
} 

lo que estoy haciendo mal aquí?

Sé que muchos de ustedes se encuentran con esta situación. ¿Podrías ayudarme chicos?

Gracias por su ayuda.

+0

Quizá cerró la base de datos fuera de la tarea asíncrona. ¿Has comprobado eso? –

+0

¿El sistema que 4.0.3 está ejecutando es más rápido que el de los otros sistemas que está utilizando, de ser así podría tener algunas condiciones de carrera ocurriendo? –

+0

No, creo que eso está bien. – GoCrazy

Respuesta

23

No puede actualizar una tabla mientras itera sobre los resultados de una consulta. Hay buenas razones para esto; ¿Qué sucede si los datos que está agregando causarían un cambio en los datos que está iterando? Su cursor no devolverá datos válidos.

Intentando almacenar datos nuevamente en la tabla en updateAverage() está causando el problema. Solo debe recordar el valor promedio durante su ciclo, y luego actualizarlo una vez al final después de que haya terminado de pasar el cursor.

Para explicar mejor el error exacto que está recibiendo: el hecho de insertar datos nuevos hace que la base de datos cierre todos los cursores que están actualmente abiertos, como medida de seguridad. Entonces, cuando llamas al sum_cursor.moveToNext() después de actualizar el promedio, el cursor se sorprende al descubrir que ya se ha cerrado.

+0

Gracias por tu fabulosa información .. De tu información lo que obtuve es almacenar el valor promedio en el conjunto o lista y luego actualizarlo en otro ciclo. ¿Tengo razón? – GoCrazy

+0

Sí, algo así. –

+0

gracias lo intentaré y te lo haré saber .. y gracias por tu apoyo inmediato +1 por ese – GoCrazy

2

¿Qué pasa si hace un comentario db.updateAverage(id, average)?

+0

gracias por su respuesta ... en realidad 'db .updateAverage (id, average) 'es muy importante ... basándome en esta actualización, solo voy al siguiente paso – GoCrazy

+0

@Vinoth. Quiero decir, si lo comenta, ¿desaparecerá el error? –

+0

lo siento alex no pude probar ahora porque ese teléfono era mis amigos ... puedo probar solo mañana y dejarte saber ... está realmente conectado – GoCrazy

0

Puede lograr su objetivo con SQL pura es más rápido y mejor desde el punto de vista de la arquitectura, porque toda lógica estará en una transacción de SQL

REPLACE INTO table_where_to_put SELECT *, (totalmatchedscore/totalingredients) as average FROM table_with_input_data 

Uso REPLACE O UPDATE

Cuestiones relacionadas