Курсор завершен без предварительного закрытия () Android

В моем приложении у меня есть просмотр списка. Я получаю свои данные по запросу из базы данных SQLiteDatabase. Когда я получаю данные из БД, я получаю эту ошибку:

Это происходит, когда я иду от линии 20 до 21.

Я попытался поместить cursor.deactivate () и cursor.close () на regel 50. Но безрезультатно. Кто-нибудь знает, почему я получаю эту ошибку и как ее решить? Спасибо :)

 Timon Devos04 мая 2012 г., 09:56
@thinksteep Я видел этот вопрос, но когда я попробовал решение, оно не сработало. Спасибо за помощь
 dymmeh03 мая 2012 г., 17:36
Не имеет отношения к ответу. Вы должны вызвать getReadableDatabase () вместо getWriteableDatabase (). Нет необходимости получать доступный для записи объект БД, когда все, что вы делаете, читает из него.
 kosa03 мая 2012 г., 17:21

Ответы на вопрос(4)

Вы должны закрыть курсор перед базой данных. Поместите свой код вtry / catch блок и вfinally блок, закройте курсор и затем закройте базу данных:

try {
    db = ...
} catch(Exception ex) { 
    // Log the exception's message or whatever you like
} finally {
    try {
      if( cursor != null && !cursor.isClosed())
        cursor.close();
       if( db.isOpen() )
        db.close();
    } catch(Exception ex) {}
}

Закрытие последовательности имеет большое значение при выполнении операций ввода-вывода с БД или контент-провайдерами. Для получения дополнительной информации обратитесьэта ссылка

 Timon Devos04 мая 2012 г., 12:59
У меня есть два устройства, HTC Desire и Samsung Galaxy Nexus. С Желанием я не получаю ошибку. С Galaxy Nexus я делаю.

вызывая cursor.close () перед закрытием базы данных. Это должно исправить вашу проблему.

просто включите StrictMode для отладочной версии следующим образом:

public void onCreate() {
     if (DEVELOPER_MODE) {
         StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
                 .detectDiskReads()
                 .detectDiskWrites()
                 .detectNetwork()   // or .detectAll() for all detectable problems
                 .penaltyLog()
                 .build());
         StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
                 .detectLeakedSqlLiteObjects()
                 .detectLeakedClosableObjects()
                 .penaltyLog()
                 .penaltyDeath()
                 .build());
     }
     super.onCreate();
 }

больше информации @http://developer.android.com/reference/android/os/StrictMode.html

всего наилучшего,

startManagingCursor(c) и все будет хорошо.

 Akhil04 мая 2012 г., 13:06
Это метод Activity.например, вы получаете курсор из вашего DBAdapter и устанавливаете его в виде списка внутри Activity.Вне действия вызовите startManagingCursor (c) перед передачей setAdapter () ..;
 Vincy26 февр. 2013 г., 14:40
Просто скажи свой код; так что в вашем случае перед тем, как db.close () вызовет cursor.close (), вот и все. Таким образом, кодовая последовательность является cursor.close (); курсор = ноль; db.close ();
 Timon Devos04 мая 2012 г., 15:50
Да, конечно, есть курсор. Но курсор, который я использую, находится в классе DatabaseAdapter (класс со всеми методами для получения / добавления / удаления данных из базы данных). Я использую ArrayAdapter для заполнения моего ListView. Поэтому я получаю данные из базы данных с помощью курсора и помещаю их в массив данных, которые возвращаю и передаю в ArrayAdapter. Так что нет курсора в ArrayAdapter
 Timon Devos04 мая 2012 г., 13:12
Я работаю с ArrayAdapter. Поэтому я возвращаю не курсор, а массив. Как мне решить эту проблему с помощью массиваадаптера?
 Timon Devos04 мая 2012 г., 13:01
Где я это пишу? Потому что в моем классе DatabaseAdapter (расширяет SQLiteOpenHelper) он не находит "startmanagingcursor ()"

Ваш ответ на вопрос