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启动后调用ContactProvider2的query方法,
匹配的uri为Contacts.CONTENT_FILTER_URI的分支。
5. 在ContactProvider2的appendSearchIndexJoin方法中拼接Sql语句,并调用Sqlite的底层query语句查询。
6. 完成查询后回调LoaderManager的onLoaderFinish刷新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
更多相关文章
- SQLite数据库相关(三) SQLiteOpenHelper类
- Android开发系列(二十二):AdapterViewFlipper的功能和使用方法
- Android(安卓)播放视频常见问题小结
- 调用startactivityforresult后,onactivityresult立刻返回RESULT_C
- Android(安卓)Studio 四大组件之 Service的生命周期上
- Android(安卓)中Binder的解释
- Android(安卓)开发过程中遇到的各类问题总结
- Android在onCreate()方法中动态获取TextView控件的高度
- Android两种不同的方法去实现图像的放大与缩小