W/CursorWrapperInner(8375): курсор завершен без предварительного закрытия()

Я устал от этой проблемы, на самом деле не знаю, в чем проблема. Ниже приведен мой код:

private void readSMS() throws IOException {
    // TODO Auto-generated method stub
    Log.d("Read SMS","Called");
    ContentResolver cr = context.getContentResolver();
    Uri uri = Uri.parse("content://sms/inbox");
    StringBuilder smsBackup = new StringBuilder(); 
    Cursor messagesCursor = cr.query(uri, new String[] { "_id","address","body","person"}, null,null, null);
    smsBackup.append("SMS Back UP (Total Message(s)::"+messagesCursor.getCount()+") \n\n");

    String name = null;
    if(messagesCursor.getCount() > 0){
        while(messagesCursor.moveToNext()){
            name = null;
            name = getName(messagesCursor.getString(messagesCursor.getColumnIndex("address")));

            if(name==null)
                name = "Sender : " + messagesCursor.getString(messagesCursor.getColumnIndex("address"));

            smsBackup.append("Sender : "+name +"\n"+  "Message : "+messagesCursor.getString(messagesCursor.getColumnIndex("body")) + "\n\n");
        }
    }

    Log.d("InSMS Lenght","::"+smsBackup.toString().length());
}

вот сообщение журнала: W/CursorWrapperInner(8375): Курсор завершен без предварительного закрытия()


person Caution Continues    schedule 28.02.2013    source источник


Ответы (2)


Вы должны закрыть объект Cursor после завершения работы с ним.

person Jong    schedule 28.02.2013
comment
Вы имеете в виду выше Log.d(InSMS Lenght,::+smsBackup.toString().length()); Я сделал это и забыл напечатать здесь, но это не работает, дорогая. - person Caution Continues; 01.03.2013

Это может быть старым, но вот почему.

Не бросайте исключение здесь:

readSMS() throws IOException

вместо этого оберните блок try catch следующим образом:

try{
    ContentResolver cr = context.getContentResolver();
    Uri uri = Uri.parse("content://sms/inbox");
    StringBuilder smsBackup = new StringBuilder(); 
    Cursor messagesCursor = cr.query(uri, new String[] { "_id","address","body","person"}, null,null, null);
    smsBackup.append("SMS Back UP (Total Message(s)::"+messagesCursor.getCount()+") \n\n");

    String name = null;
    if(messagesCursor.getCount() > 0){
        while(messagesCursor.moveToNext()){
            name = null;
            name = getName(messagesCursor.getString(messagesCursor.getColumnIndex("address")));

            if(name==null)
                name = "Sender : " + messagesCursor.getString(messagesCursor.getColumnIndex("address"));

            smsBackup.append("Sender : "+name +"\n"+  "Message : "+messagesCursor.getString(messagesCursor.getColumnIndex("body")) + "\n\n");
        }
    }
 messagesCursor.close();
}catch(IOException e){
//handle here, if not log it
}finally{
//can also close here if you want, need to wrap in another try block and check for null
}

Похоже, проблема в том, что ioexception перехватывается до того, как можно будет вызвать close(). Затем метод вызывается в этой точке и никогда не вызывается. Могу ошибаться, просто бегло посмотрел. Надеюсь, это поможет.

person wseme    schedule 10.02.2014