База данных контактов Android: как оптимизировать таблицу поиска телефона? - PullRequest
0 голосов
/ 29 ноября 2018

Когда я хочу использовать таблицу phone_lookup для запроса display_name, я нахожу вводить как:

'Таблица, которая представляет результат поиска номера телефона, например, для идентификатора вызывающего абонента.Чтобы выполнить поиск, вы должны добавить номер, который вы хотите найти, к CONTENT_FILTER_URI.Этот запрос очень оптимизирован для разработчиков Android.

Но я не знаю, как Google оптимизировал этот запрос?

https://developer.android.com/reference/android/provider/ContactsContract.PhoneLookup

Я сделал запрос. Наконец, это объясняется следующим образом:

SELECT data1 AS number,
    contacts_view._id AS contact_id,
    contacts_view.photo_uri AS photo_uri,
       contacts_view.send_to_voicemail AS send_to_voicemail,
       data_id AS data_id,
       contacts_view.lookup AS lookup,
       contacts_view.display_name AS display_name,
       contacts_view.last_time_contacted AS last_time_contacted,
       contacts_view.has_phone_number AS has_phone_number,
       contacts_view.in_visible_group AS in_visible_group,
       contacts_view.photo_file_id AS photo_file_id,
       data3 AS label,
       contacts_view.starred AS starred,
       data4 AS normalized_number,
       contacts_view.photo_thumb_uri AS photo_thumb_uri,
       contacts_view.in_default_directory AS in_default_directory,
       contacts_view.photo_id AS photo_id,
       contacts_view.custom_ringtone AS custom_ringtone,
       contacts_view._id AS _id,
       data2 AS type,
       contacts_view.times_contacted AS times_contacted
  FROM raw_contacts
       JOIN
       view_contacts AS contacts_view ON (contacts_view._id = raw_contacts.contact_id),
       (
           SELECT data_id,
                  normalized_number,
                  length(normalized_number) AS len
             FROM phone_lookup
            WHERE (phone_lookup.min_match = '.....') 
       )
       AS lookup,
       data
 WHERE (lookup.data_id = data._id AND 
        data.raw_contact_id = raw_contacts._id AND 
        (lookup.normalized_number = '+......' OR 
         lookup.len <= 11 AND 
         substr('.....', 11 - lookup.len + 1) = lookup.normalized_number OR 
         (lookup.len > 11 AND 
          substr(lookup.normalized_number, lookup.len + 1 - 11) = '.....') ) ) 
 ORDER BY length(lookup.normalized_number) DESC

1 Ответ

0 голосов
/ 13 декабря 2018

Спасибо, я прочитал исходный код. Я обнаружил, что «высокооптимизированный» означает оптимизацию на уровне базы данных вместо оптимизации на уровне кода. Более подробно, Android создает несколько некластеризованных индексов в таблице phone_lookup для повышения скорости запросов.https://blog.csdn.net/skysukai/article/details/84632943

...