Идет ли чтение курсора Android до базы данных? - PullRequest
3 голосов
/ 16 декабря 2010

У меня есть какое-то тяжелое приложение для Android, и я хочу убедиться, что оно никогда не ANR.

Я переместил запросы к базе данных из потока пользовательского интерфейса (в AsyncTasks), но я все еще читаюот курсора в потоке пользовательского интерфейса, так как я предполагаю, что возвращенный курсор хранится где-то в памяти, то есть его фактическое чтение не проходит весь путь к базе данных.Это правильно, или мне действительно нужно переместить все чтения курсора также в потоки, не связанные с пользовательским интерфейсом?

Чтобы быть более точным:

Например, http://developer.android.com/reference/android/database/Cursor.html#getInt(int) читать изили это вызывает какую-то блокировку чтения из реальной базы данных SQLite.

Я предполагаю, что реализация Cursor в моем случае является SQLiteCursor, так как ContentProvider реализован с использованием базы данных SQLite.

1 Ответ

10 голосов
/ 16 декабря 2010

Когда вы вызываете query() или rawQuery() на SQLiteDatabase, Cursor возвращается немедленно, поскольку сам фактический запрос задерживается до тех пор, пока вы не начнете использовать данные.Любой вызов, который манипулирует Cursor или нуждается в данных, которые подразумевают, что запрос выполнен (например, getCount()), фактически выполнит запрос.Следовательно, лучше всего «прикасаться» к Cursor в doInBackground(), пока вы находитесь в фоновом потоке.

Впрочем, с этого момента весь набор результатов находится в памяти, для наборов результатов в1Мб.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...