В чем разница между MediaStore.Images.Media.query () и ContentResolver.query () [duplicate]

Если вы не инициализировали ссылочный тип и хотите установить или прочитать одно из его свойств, он будет генерировать исключение NullReferenceException.

Пример:

Person p = null;
p.Name = "Harry"; // NullReferenceException occurs here.

Вы можно просто избежать этого, проверив, является ли переменная не нулевой:

Person p = null;
if (p!=null)
{
    p.Name = "Harry"; // Not going to run to this point
}

Чтобы полностью понять, почему выбрано исключение NullReferenceException, важно знать разницу между типами значений и ссылочные типы .

Итак, если вы имеете дело со типами значений, NullReferenceExceptions не может произойти. Хотя вам нужно поддерживать оповещение при работе со ссылочными типами!

Только ссылочные типы, как следует из названия, могут содержать ссылки или буквально буквально ничто (или «нуль»). Если типы значений всегда содержат значение.

Типы ссылок (эти должны быть проверены):

  • динамический
  • объект
  • string

Типы значений (вы можете просто игнорировать эти):

  • Числовые типы
  • Интегральные типы
  • Типы с плавающей запятой
  • decimal
  • bool
  • Пользовательские структуры

46
задан Carl Manaster 24 August 2010 в 23:56
поделиться

2 ответа

managedQuery() будет использовать запрос ContentResolver (). Разница в том, что с managedQuery() активность будет содержать ссылку на ваш курсор и закрывать ее по мере необходимости (например, в onDestroy().) Если вы сами query(), вам придется управлять курсором как чувствительным ресурсом , Если вы забудете, например, close() его в onDestroy(), вы пропустите основные ресурсы (logcat предупредит вас об этом.)

Чтобы запросить поставщика контента, вы можете использовать либо ContentResolver.query() или Activity.managedQuery(). Оба метода принимают один и тот же набор аргументов, и оба возвращают объект Cursor. Однако managedQuery() заставляет деятельность управлять жизненным циклом Курсора. Управляемый курсор обрабатывает все тонкости, такие как разгрузка, когда активность приостанавливается, и запрашивает себя при перезапуске активности. Вы можете попросить Activity начать управление неуправляемым объектом Cursor для вас, вызвав Activity.startManagingCursor().

Обновление:

managedQuery теперь устарело (начиная с Android 3.0).

72
ответ дан Pentium10 25 August 2018 в 09:50
поделиться

managedQuery (..) теперь устарел (начиная с Android 3.0). Остерегайтесь ..

Ошибка Android: java.lang.IllegalStateException: пытается запросить уже закрытый курсор

23
ответ дан Community 25 August 2018 в 09:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: