Подтвердить что ты не робот

Что заставляет Android ContentResolver.query() возвращать null?

В каких условиях ContentResolver.query() возвращает null вместо объекта курсора? Я получил пустые курсоры, но только понял, что метод также может вернуть значение null. Я не смог отслеживать обстоятельства, в которых это происходит.

4b9b3361

Ответ 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.