Как оценить эффективность ContentProviders в Android?

У меня мало вопросов, связанных с платформой Android, которые я не мог найти ни на сайте разработчика Android, ни в другом месте. Поэтому у меня возникает соблазн спросить здесь.

Мне задали этот вопрос в интервью:

Как вы оцениваете эффективность ContentProviders в Android?

Сколько времени требуется, если вы хотите получить 3000 контактов? Будет ли такое же время, если вы хотите получить электронную почту от контактов?

Первый вопрос

Сколько времени требуется, если вы хотите получить 3000 контактов?

-> В зависимости от скорости устройства, в любом случае временная сложность линейна по размеру ввода: O (n)

Второй вопрос

Будет ли такое же время, если вы хотите получить электронную почту от контактов?

-> AFAIK Письма контактов находятся в таблице данных , в разделе « Сырой контакт» , и у каждого контакта может быть более одного электронного письма, поэтому, возможно, вам нужно больше времени, чтобы получить все электронные письма всех контактов по сравнению с тем, чтобы получить только контакты ,

Поставщик контактов является компонентом поставщика контента для Android. Он поддерживает три типа данных о человеке, каждый из которых соответствует таблице, предлагаемой поставщиком, как показано на

Введите описание изображения здесь

Подробнее ЗДЕСЬ

Как вы оцениваете эффективность ContentProviders в Android?

Это будет оцениваться по времени ожидания запроса. Таким образом, вы можете измерить худшее время для запроса, который можно сравнить, сравнить его с требованиями к вашему приложению и посмотреть, может ли это вызвать значительное время ожидания для пользователя.

Сколько времени требуется, если вы хотите получить 3000 контактов?

Запустите код и измерьте. Будет отличаться на разных устройствах и версиях.

Будет ли такое же время, если вы хотите получить электронную почту от контактов?

Типы электронной почты и типа «данные», вероятно, находятся в одной таблице . Каждая запись относится к данным типа MIME, поэтому для «электронной почты» потребуется дополнительная запись. Хорошо сформированный запрос может извлекать данные из нескольких типов за один раз, затем его код обработки курсора, чтобы различать его.

Это всего лишь вопрос выбора * из таблицы. Ответ. Более эффективно выбирать (столбцы, которые вам нужны) из таблицы.

Лучший сценарий senario для чтения у поставщика контента достигается, когда проекция содержит только те столбцы, которые вы собираетесь использовать, и у вас есть хорошо закодированный цикл для чтения данных.

Если вы передадите null для проецирования, потребуется столько же времени, потому что все столбцы поставщика контента будут возвращены на оба вызова.

Если при первом вызове вы передаете key_id для проецирования и 2-го прохождения вы пройдете {key_id, key_email}, второй проход займет больше времени, потому что поставщик контента возвращает больше данных

Фактическое время зависит от того, насколько хорошо вы кодируете циклы и что вы делаете с данными в цикле. Например, если в каждом цикле вы выполняете getColumnIndex («email»), это займет намного больше времени, чем оптимизированная программа, которая определяет индексы столбцов перед входом в цикл.

Обратите внимание, что нет moveToFirst (), это самый быстрый цикл чтения для sqllite, первый вызов moveToNext () делает moveToFirst () для вас.

  if (cursor !=null) { //get column indexes here while (cursor.moveToNext()){ //processing here } } cursor.close()} 
Intereting Posts
Дублируемое значение в заголовке NavigationView после обновления текста заголовка Listview + BaseAdapter – как уведомить об изменении в одном элементе? Как я могу получить адрес электронной почты Андроид setOnItemClickListener не работает в одной строке, но ok в другой строке, используя 2 строки макетов Специальные символы между Android и PHP Java.lang.NullPointerException в GoogleApiActivity Как получить события searchview в android Производительность Android достигла более поздних версий, чем 2.3.5 (phonegap / cordova) Как перенести квадрат OpenGL пальцем? Android ImageButton, как иметь область с клики, которая больше, чем само изображение? Использование IExtendedNetworkService для получения ответа USSD на Android Использование библиотеки AppCompat для поддержки ActionBar Новый битмап изменен при копировании с использованием буфера Неправильная ориентация видеоролика на Android в VideoView Разница между «Build Target SDK» в Eclipse и Android: targetSdkVersion в AndroidManifest.xml?