13

So che questa domanda ha richiesto molte volte in SO, ma non sono riuscito a capire il mio problema esatto.Tentativo di riaprire un oggetto già chiuso: java.lang.IllegalStateException :?

Sto utilizzando il seguente codice per ottenere i dati dal database (Tabella 1) e aggiornare un altro Table2 in base al valore di recupero. Sta funzionando bene in alcune versioni di Android ma quando sono andato a testare con Android 4.0.3. Sto ottenendo questo java.lang.IllegalStateException:?.attempt to re-open an already-closed object a sum_cursor.moveToNext();.

Sto usando questo codice in 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(); 

Il mio metodo di aggiornamento di codifica

/** 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); 
} 

quello che sto facendo male qui?

So che molti di voi si imbattono in questa situazione. Potresti aiutarmi ragazzi.

Grazie per il vostro aiuto.

+0

Forse aver chiuso il database al di fuori dell'attività asincrona. Hai controllato per quello? –

+0

Il sistema che 4.0.3 è in esecuzione su qualsiasi più veloce degli altri sistemi in uso, in tal caso si potrebbero verificare alcune condizioni di gara. –

+0

No, penso che sia bello .. – GoCrazy

risposta

23

Non è possibile aggiornare una tabella durante l'iterazione sui risultati di una query. Ci sono buone ragioni per questo; cosa succede se i dati che stai aggiungendo causerebbero una modifica ai dati su cui stai iterando? Il tuo cursore non restituirebbe dati validi.

Provare a memorizzare i dati nella tabella in updateAverage() causa il problema. Dovresti semplicemente ricordare il valore medio durante il ciclo, quindi aggiornarlo una volta alla fine dopo aver completato il ciclo sul cursore.

Per spiegare ulteriormente l'errore esatto che si sta ottenendo: l'atto di inserire nuovi dati sta causando la chiusura del database di tutti i cursori attualmente aperti, come misura di sicurezza. Quindi, quando chiami sum_cursor.moveToNext() dopo aver aggiornato la media, il cursore è un po 'sorpreso nel constatare che è già stato chiuso.

+0

Grazie per le tue favolose informazioni .. Dalle tue informazioni, quello che ho ottenuto è di memorizzare il valore medio in matrice o lista e quindi aggiornarlo in un altro ciclo .. Ho ragione – GoCrazy

+0

Sì, qualcosa del genere. –

+0

grazie lo proverò e ti faccio sapere .. e grazie per il tuo supporto immediato +1 per quello – GoCrazy

2

E se commentaste db.updateAverage(id, average)?

+0

grazie per la tua risposta .. effettivamente 'db .updateAverage (id, average) 'è molto importante .. basato su questo aggiornamento sto solo andando al prossimo passo – GoCrazy

+0

@Vinoth Voglio dire, se lo commentate, allora l'errore va via? –

+0

scusa alex non ho potuto testare ora perché quel telefono era mio amico .. posso testare solo domani e farti sapere ... è davvero cablato – GoCrazy

0

È possibile raggiungere il tuo obiettivo con puro SQL è più veloce e migliore dal punto di architettura di vista, perché ogni logica sarà in una transazione di SQL

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

Usa REPLACE O UPDATE