2014-01-19 5 views
8

Я использую базу данных SQLite, и я регулярно получаю ошибки времени выполнения, я не могу найти происхождение. После запроса я использую moveToFirst, чтобы указать на первую полученную запись, и это иногда вызывает исключение android.database.CursorWindowAllocationException. К этому исключению добавляется следующее предложение: «Не удалось выполнить выделение окна курсора 2048 КБ. # Open Cursors = 736 (#cursors opendby this proc = 736)».android.database.CursorWindowAllocationException при перемещении курсора

В документации на Android я еще не нашел ничего, связанного с этим исключением. Кто-нибудь знает, что это причина и способ избежать этого?

+0

показать ваш лог кот – Android

ответ

23

Эта ошибка почти всегда связана с тем, что она не закрывает курсор, когда он закончен. Каждый раз, когда вы открываете курсор, требуется память для отображения данных, которые отображается курсором, и эта память не может быть выпущена до тех пор, пока курсор не будет закрыт. Ограничение объема памяти, доступного для этой цели, поэтому, если курсоры не закрыты, и приложение продолжает открывать новые, эта ошибка, вероятно, произойдет в какой-то момент.

Я рекомендую вам изучить ваш код, чтобы убедиться, что все созданные курсоры закрыты в какой-то момент. Также будьте осторожны с любым кодом, который открывает курсор в цикле - ваше сообщение об ошибке говорит «open Cursors = 736», что предполагает много активности курсора в каком-то цикле.

+0

Отличный пункт. Это помогло мне найти неосторожную ошибку в использовании двойного цикла с помощью курсора. Чистый хаос. – Rarw

+0

Это происходит и со мной, но он читает 'Open Cursors = 2', и я только запрашиваю новый курсор, когда старый отправляет false из' isClosed() '... что странно. – themarketka

+0

То же самое происходит со мной, и я вижу «Open Cursors = 1». Любые намеки от кого-нибудь? –

Смежные вопросы