2012-06-27 3 views
5

Hy alle,java.lang.IllegalStateException: Versuch, wieder zu öffnen, ein bereits geschlossenes Objekt: android.database.sqlite.SQLiteQuery

ich einen Fehler habe, und ich weiß nicht, was falsch ist

hier ist mein Fehler von log

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) 

und hier ist mein Code

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

Was ich wr mache ong? Und wie kann es reparieren? Vielen Dank für Hilfe

+0

getContentResolver() Objekt rechts Rückkehr DB? –

+0

fügen Sie hier mehr Code hinzu. – Sajmon

+0

akzeptieren Sie die Antwort, wenn es funktioniert :) –

Antwort

11

Der Fehler möglicherweise ist, weil Sie ein Cursor zurückkehren, die Sie bereits im finally Block geschlossen haben, und Sie können den zurückgegebenen Wert zu verwenden versuchen.

Ändern Sie den finally Block auf die folgenden:

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

und erinnere mich an die zurück Cursor von der rufenden Methode zu schließen.

+0

Ja, das ist wahr, aber stattdessen sagen, dass Sie herausfinden sollten, wo er im Code falsch macht. –

+2

Eine Methode, die einen geschlossenen Cursor zurückgibt, ohne etwas anderes auszuführen, ist eine nutzlose Methode, und das ist falsch. – user1417430

+0

Ja, da gehts endlich du hast es gefunden, Prost :) –

-1

Versuchen folgenden Zeilen des Codes zu entfernen dann wieder überprüfen,

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

hinzufügen diese stattdessen

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

        tempCurs.close(); 
       } 
+0

Sie werden einen 'Cursor' verlieren, wenn Sie die Zeilen entfernen. Es ist nicht richtig. – Rajesh

+0

Zehn, warum die Methode, die diese Zeile enthält, Cursor zurückgibt, wenn Sie den Cursor schließen wollen, der nicht mehr verwendet wird, können Sie Methode mit void als Rückgabetyp haben, ich glaube nicht, dass meine Antwort für diese nicht gewählt werden sollte. Frage selbst ist so was zu tun? :) –

+0

Ich benutze nur diese zwei Cursor in dieser Funktion. Ich öffne nicht auf einer anderen Seite. Ich denke, dass ich diese Zeilen nicht entfernen kann, weil die Cursor geschlossen werden müssen ... –

Verwandte Themen