Поведение нечетного курсора

В настоящее время я разрабатываю приложение, которое использует Database / ContentProvider для предоставления определенных данных о местоположении, которые извлекаются из сети и периодически хранятся локально в базе данных.

Я проверил, что база данных правильно создана в приложении, а таблицы заполнены данными, экспортировав копию локальной базы данных приложения на SD-карту для просмотра в браузере SQL - поэтому данных, которых нет, нет проблема здесь.

Странное поведение, вероятно, лучше визуализировать с помощью нескольких снимков экрана моего процесса отладки:

Итак, изначально, когда я делал свои запросы, все мои Cursor объекты возвращали -1 для количества строк, даже если я проверил, что SELECT * FROM TABLE_NAME оператор должен возвращать значения, так как база данных, которую я извлек из устройства, содержит данные строки. Вот посмотрите на шаг отладчика:

Обратите внимание, что когда курсор возвращается изначально, mCount отображается как -1.

Из любопытства я добавил курсор.moveToFirst(); позвоните, и вот скриншот после этого шага:

Обратите внимание, что количество курсоров изменилось с -1 на 3, что соответствует правильному количеству строк (поскольку приложение учитывает только 3 континента атм). К сожалению, эта добавленная строка, которая должна быть ненужной, по-прежнему не решает мою проблему, поскольку CursorAdapter.bindView() и CursorAdapter.newView() по-прежнему не могут быть вызваны с результирующим курсором.

Я не совсем понимаю, что может быть причиной этой проблемы и как ее исправить? Если кто-нибудь может дать какое-либо представление о том, в чем может быть проблема, пожалуйста, дайте мне знать. Кроме того, если потребуется какой-либо дополнительный код, такой как операторы создания SQL и т. Д., Дайте мне знать - однако, как я уже упоминал, база данных создается нормально, а запросы, выполняемые для экспортированной копии БД вне приложения Android, работают нормально....

И последнее, приложение построено для уровней API 14+.

1 ответ

Решение

Если у вас есть SQL-запрос, который читает из базы данных, вы можете отложить чтение этих данных, пока не будете уверены, что будете их использовать.

Поэтому, когда вы звоните rawQuery вы получаете ссылку на Cursor объект. Но ничего еще не прочитано. Это то, чтоmoveToFirst делает. Это первое, что говорит курсору, что вы серьезно относитесь к выполнению этого SQL-запроса и хотите получить результат.

Но так как вы используете rawQuery ничего не передается в базу данных, прежде чем пытаться получить результат с moveToFirst,

Надеюсь, что это ответ на ваш вопрос.