2012-06-27 9 views
5

Hy tutti,java.lang.IllegalStateException: tentativo di riaprire un oggetto già chiusa: android.database.sqlite.SQLiteQuery

ho un errore e non so che cosa è sbagliato

Ecco il mio errore dal registro

java.lang.IllegalStateException: attempt to re-open an already-closed object: android.database.sqlite.SQLiteQuery (mSql = SELECT display_name, _id FROM view_data_restricted data WHERE (1) AND (data1 =? AND mimetype='vnd.android.cursor.item/group_membership' AND display_name like '%r%') ORDER BY display_name) 

e qui è il mio codice

public Cursor runQuery(CharSequence constraint) { 
filter = nome.getText().toString(); 

try{ 
tempCurs = getContentResolver().query(ContactsContract.Groups.CONTENT_URI, 
    new String[]{ContactsContract.Groups._ID,ContactsContract.Groups.TITLE}, 
    ContactsContract.Groups.ACCOUNT_NAME + " =? " + " AND " + ContactsContract.Groups.TITLE + " !=? ", 
    new String[]{accountName,nomeGrupo}, 
    null 
    );  
if(tempCurs.moveToFirst()) 
    do{ 
     cursorContactosGrupos = getContentResolver().query(ContactsContract.Data.CONTENT_URI, 
       new String[]{ContactsContract.CommonDataKinds.GroupMembership.DISPLAY_NAME, ContactsContract.CommonDataKinds.GroupMembership._ID}, 
       ContactsContract.CommonDataKinds.GroupMembership.GROUP_ROW_ID + " =? AND " + Data.MIMETYPE + "='" + ContactsContract.CommonDataKinds.GroupMembership.CONTENT_ITEM_TYPE + "' AND " + ContactsContract.CommonDataKinds.GroupMembership.DISPLAY_NAME + " like '%" + filter + "%'" , 
       new String[]{String.valueOf(tempCurs.getLong(0))}, 
       ContactsContract.CommonDataKinds.GroupMembership.DISPLAY_NAME 
       ); 
     //Log.w(SocioEdit.class.getName(), "->" + cursorContactosGrupos.getString(cursorContactosGrupos.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME))); 
      }while(tempCurs.moveToNext()); 
     }finally{ 
      if(cursorContactosGrupos != null && tempCurs != null && !cursorContactosGrupos.isClosed() && !tempCurs.isClosed()){ 
       cursorContactosGrupos.close(); 
       tempCurs.close(); 
      } 
     } 
     return cursorContactosGrupos; 
    }  
}); 

Quello che sto facendo wr ong? E come può risolvere? Grazie per l'aiuto

+0

getContentResolver() ritorno DB oggetto giusto? –

+0

aggiungi qui altro codice. – Sajmon

+0

accetta la risposta se funziona bene :) –

risposta

11

L'errore è forse perché si restituisce un Cursor che si è già chiuso nel blocco finally e si può tentare di utilizzare il valore restituito.

Modificare il finally blocco al seguente:

finally{ 
    if(tempCurs != null && !tempCurs.isClosed()){ 
     tempCurs.close(); 
    } 
} 

e ricordarsi di chiudere la tornata Cursor dal metodo chiamante.

+0

Sì, è vero ma invece dice che dovresti scoprire dove sta facendo male nel codice. –

+2

Un metodo che restituisce un cursore chiuso senza eseguire qualcos'altro è un metodo inutile e che di per sé è sbagliato. – user1417430

+0

Sì, ecco, finalmente l'hai trovato, Saluti :) –

-1

Prova rimozione seguenti righe del codice quindi controllare di nuovo,

finally{ 
      if(cursorContactosGrupos != null && tempCurs != null && !cursorContactosGrupos.isClosed() && !tempCurs.isClosed()){ 
       cursorContactosGrupos.close(); 
       tempCurs.close(); 
      } 

Aggiungi questo invece

finally{ 
       if(cursorContactosGrupos != null && tempCurs != null && !cursorContactosGrupos.isClosed() && !tempCurs.isClosed()){ 

        tempCurs.close(); 
       } 
+0

Si perde un "Cursore" se si rimuovono le linee. Non è corretto. – Rajesh

+0

Dieci perché il metodo che contiene questa riga restituisce il cursore se si desidera chiudere il cursore che non sarà più in uso, si può avere il metodo con void come tipo restituito, non credo che la mia risposta debba essere votata per questo, la domanda stessa è così che fare? :) –

+0

Ho appena usato questi due cursori in questa funzione. Non apro da un'altra parte. Penso di non poter rimuovere queste righe perché i cursori devono essere chiusi ... –

Problemi correlati