2012-06-27 27 views
5

Hỷ tất cả mọi người,java.lang.IllegalStateException: cố gắng mở lại một đối tượng đã kín: android.database.sqlite.SQLiteQuery

Tôi có lỗi và tôi không biết những gì là sai

đây là lỗi của tôi từ nhật ký

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) 

và đây là mã của tôi

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

Những gì tôi đang làm wr Và làm thế nào có thể sửa chữa? Nhờ sự giúp đỡ

+0

getContentResolver() return DB đối tượng phải không? –

+0

thêm mã này vào đây. – Sajmon

+0

chấp nhận câu trả lời nếu nó hoạt động tốt :) –

Trả lời

11

Lỗi này là có thể bởi vì bạn đang trở về một Cursor mà bạn đã đóng trong khối finally và bạn có thể cố gắng sử dụng giá trị trả về.

Thay đổi finally khối như sau:

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

và nhớ để đóng trở Cursor từ phương pháp gọi điện thoại.

+0

Có, Thats đúng nhưng thay vì nói rằng bạn nên tìm ra nơi ông đang làm sai trong mã. –

+2

Một phương thức trả về một con trỏ đã đóng mà không thực hiện bất cứ điều gì khác là một phương pháp vô ích và chính nó là sai. – user1417430

+0

Vâng, có bạn cuối cùng bạn tìm thấy nó, Cheers :) –

-1

Hãy thử loại bỏ dòng mã sau đây của bạn sau đó kiểm tra một lần nữa,

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

Thêm này thay vì

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

        tempCurs.close(); 
       } 
+0

Bạn sẽ bị rò rỉ một 'Con trỏ' nếu bạn xóa các dòng. Nó không đúng. – Rajesh

+0

Mười lý do tại sao phương thức chứa dòng này trả về con trỏ nếu bạn muốn đóng con trỏ sẽ không còn sử dụng nữa, bạn có thể có phương thức void như kiểu trả về, tôi không nghĩ rằng câu trả lời của tôi sẽ bị bỏ phiếu cho điều này, câu hỏi chính nó là như thế này phải làm gì? :) –

+0

Tôi chỉ sử dụng hai con trỏ này trong hàm này. Tôi không mở ở phía bên kia. Tôi nghĩ rằng tôi không thể loại bỏ dòng này vì các con trỏ cần được đóng lại ... –

Các vấn đề liên quan