首页 > 解决方案 > Android联系人数据库:如何高度优化手机查找表?

问题描述

当我想使用 phone_lookup 表查询 display_name 时,我发现介绍如下:

'表示查找电话号码结果的表格,例如来电显示。要执行查找,您必须将要查找的数字附加到 CONTENT_FILTER_URI。此查询在 android 开发人员中高度优化。

但我不知道谷歌是如何优化这个查询的?

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

标签: androidcontacts

解决方案


Thanks all,I've read source code.I found that 'highly optimized' means database level optimization instead of code level optimization.In more detail, Android create several nonclustered index in the phone_lookup table to improve query speed. https://blog.csdn.net/skysukai/article/details/84632943


推荐阅读