В каких условиях ContentResolver.query() возвращает null вместо объекта курсора? Я получил пустые курсоры, но только понял, что метод также может вернуть значение null. Я не смог отслеживать обстоятельства, в которых это происходит.
Что заставляет Android ContentResolver.query() возвращать null?
Ответ 1
Я просто наткнулся на ту же проблему из-за сообщения о сбое пользователя, которое я получил сегодня для моего приложения. Если документация на Android неясно о чем-то, она помогает смотреть на исходный код. Вот что я нашел о причинах возврата ContentResolver.query()
null
:
-
Поставщик содержимого не может быть приобретен. Это может быть связано с проблемой с указанным
Uri
или потому, что он просто не существует в системе. Если Uri является проблемой, причины следующие: протокол неcontent://
, или Uri не имеет части строки полномочий (Uri.getAuthority() == null). -
Полученный поставщик метод запроса сам возвращает
null
. -
Поставщик контента мог быть приобретен, но во время запроса было выбрано RemoteException.
Особенно из-за (2.) это довольно произвольно, что может быть причиной для null
в результате, поскольку правил нет. Но обычно, если SQLite является back-end ContentProvider
, вы можете ожидать, по крайней мере, какого-то пустого объекта Cursor вместо результата null
.
Android-система ContentProvider
выполняет некоторые проверки, прежде чем они вернут что-либо. Если вход не соответствует ожидаемому, вероятность того, что null
может быть возвращена, маловероятна. Но, честно говоря, это никогда не случалось со мной раньше. Обычно я получаю IllegalArgumentException
в случае проблем с параметрами запроса. Возможно, некоторые реализации ContentProvider возвращают null
в случае пустых наборов результатов.
В любом случае. Кажется, необходимо, чтобы всегда проверял значение null. Особенно, например, номер причины (3.) - это то, что может случиться на любом устройстве Android.
Ответ 2
ContentResolver.query
возвращает значение null, если схема uri не имеет формы content://
или если contentProvider
для самой схемы не существует.
Ответ 3
ContentResolver.query() возвращает null в следующих случаях:
Если вы попытаетесь передать имена столбцов, которых нет в базе данных (очень распространенный случай - когда разработчики используют константы в качестве столбца имена, потому что они похожи на столбцы).
Вероятно, это будет null, потому что ваш аргумент URI недействителен.
Могут быть и другие случаи, в которых он возвращает null. Тем не менее, вышеупомянутые два случая - очень распространенные причины, по которым разработчики тянут свои волосы:)
Ответ 4
Если вы забыли объявить провайдера в манифесте, ваши запросы могут вернуть значение null.
Ответ 5
У меня была та же проблема. Моя ошибка заключалась в том, чтобы не закрыть курсор для провайдера, чтобы более поздний запрос вызывал нуль.
Ответ 6
Если результата нет, он возвращает null. Я хочу сказать, что если данный запрос базы данных ничего не дает (даже не одна строка данных), тогда query() возвращает значение null.