android contacts 联系人搜索解析

 

Android contacts 联系人 通讯录 源码 完全解析

http://blog.csdn.net/Kafka_88/article/details/50670406#35联系人搜索

 

 

在Contacts应用内搜索联系人, 主要步骤: 
1. 在主界面PeopleActivity点击联系人搜索按钮,触发onAction方法。 
2. 调用restartLoader来启动Loader异步更新数据。 
3. 在LoadeManager的回调接口onCreateLoader创建、配置Loader,包括查询的Uri等,此阶段配置的uri参数为Contacts.CONTENT_FILTER_URI。 
4. Loader启动后调用ContactProvider2query方法, 
匹配的uri为Contacts.CONTENT_FILTER_URI的分支。 
5. 在ContactProvider2appendSearchIndexJoin方法中拼接Sql语句,并调用Sqlite的底层query语句查询。 
6. 完成查询后回调LoaderManageronLoaderFinish刷新UI

 

 

queryLocal

case CONTACTS_FILTER: {}

 

setTablesAndProjectionMapForContactsWithSnippet

 

appendSearchIndexJoin  

            // general case: not a phone number, not an email-address
            sb.append(SearchIndexManager.getFtsMatchQuery(filter,
                    FtsQueryBuilder.SCOPED_NAME_NORMALIZING));

 

/**
 * Maintains a search index for comprehensive contact search.
 */
public class SearchIndexManager {

        /**
         * Scopes each token to a column and normalizes the name.
         * Example: "content:foo* name:a1b2c1* tokens:foo* content:bar* name:a2b3c2* tokens:bar*"
         */
        public static final FtsQueryBuilder SCOPED_NAME_NORMALIZING =
                new ScopedNameNormalizingBuilder();

 

 private static class ScopedNameNormalizingBuilder extends FtsQueryBuilder {

 

    private static class UnscopedNormalizingBuilder extends FtsQueryBuilder {

}

 

 ContactsProvider2  : sb=view_contacts JOIN (SELECT contact_id AS snippet_contact_id, content AS snippet FROM search_index WHERE search_index MATCH 'content:t* OR name:CE* OR tokens:t*' AND snippet_contact_id IN default_directory) ON (_id=snippet_contact_id)

 

contacts2.db

search_index_context:

docid  c0contact_id  c1content   c2name                                      (voicemail)                                           c3tokens 

8         7                                            D2C4B8ACB0C0A8B8BE D2C4B8ACB0C0A8B8BE D2               telephonenumber

 

                                                         a=A8  v=D2...   1=14

 

 

 

你可能感兴趣的:(Android,应用)