当前位置: 代码迷 >> Android >> Android联系人读取操作札记
  详细解决方案

Android联系人读取操作札记

热度:85   发布时间:2016-04-28 06:40:31.0
Android联系人读取操作笔记

转于:http://blog.csdn.net/yao_guet/article/details/6626001

---------------------------------------------------------------------------------------------------

?

Android中的联系人都保存在一个SQLite数据库中,有兴趣的可以使用adb直接push出来看一下里面的表和视图的结构,

它的路径为:/data/data/com.android.providers.contacts/databases/contacts2.db

?

在联系人数据库中,保存的都是一些小的数据表,即与把所有数据保存成一个表不同,它会对联系人的资料模块化,然后分成多个表保存。

表与表之间使用id相关联起来,这样做的目的是尽量减小数据表的规模,提高数据检索的速度,因为我们检索的时候不是每次都需要读取所有的联系人资料的,这样可以更灵活的选择我们所关心的内容,提高检索速度,

虽然分开的保存数据,可以提高检索的速度,但是也给我们带来了一些不便,就是需要把这些分开的表再重新联合起来,组成我们所需要的完整的数据。好在这些,android已经替我们准备好了,它在数据库里面建了一些视图,呵呵,视图就是虚拟表。并且,android也提供了很多接口,通过ContentResolver().query方法,传入不同的URI即可访问相应的数据集。

在联系人数据库里面联系人和电话号码是分别存在两个表里面的,因为存在一个联系人拥有几个号码的情况,所以android为联系人和手机号码分别单独创建了相应的视图。

联系人信息的视图里面只保存与联系人相关的资料,例如姓名,是否有手机号码等。

而手机号码资料则是每一个电话号码为一条记录,如果有一个联系人有3个号码,则里面会出现3个该联系人的记录,号码分别为他的三个号码。

?

如果是需要读取联系人信息,传入的URI为:ContactsContract.Contacts.CONTENT_URI

如果是需要读取手机号码信息传入的URI为:ContactsContract.CommonDataKinds.Phone.CONTENT_URI

?

下面再看看query函数的原型,只读取关心的字段,应该可以提高一点速度

query(Uri?uri,?String[]?projection,?String?selection,?String[]?selectionArgs,?String?sortOrder)

projection:是需要读取的字段

selection:是数据检索的条件

selectionArgs:是数据检索条件的参数

sortOrder:是排序的字段

在android联系人表里面一个两个比较有意思的字体sort_key和sort_key_alt,它里面保存的是联系人名字的拼音字母,

例如联系人名字是“李明”,则sort_key保存的是“LI李MING明”,这样如果是按sort_key或sort_key_alt排序的话,就可以实现按汉字的拼音字母排序了,,,

?

下面给读取系统所有联系人的代码片段,读取所有的联系人,然后每读一个联系人,再把该联系人的所有号码读出来

(这个因为需要不断的去检索数据库,所以会很慢,大家有什么方法提高SQLite数据库的检索的方法没??):

?

[java]?view plaincopy
?
  1. //?the?selected?cols?for?contact?users??
  2. String[]?selectCol?=?new?String[]{??
  3. ????????ContactsContract.Contacts.DISPLAY_NAME,??
  4. ????????ContactsContract.Contacts.HAS_PHONE_NUMBER,??
  5. ????????ContactsContract.Contacts._ID??
  6. ????};??
  7. public?static?final?int?COL_NAME?=?0;??
  8. public?static?final?int?COL_HAS_PHONE?=?1;??
  9. public?static?final?int?COL_ID?=?2;??
  10. ??
  11. //?the?selected?cols?for?phones?of?a?user??
  12. String[]?selPhoneCols?=?new?String[]?{??
  13. ????????ContactsContract.CommonDataKinds.Phone.NUMBER,??
  14. ????????ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,??
  15. ????????ContactsContract.CommonDataKinds.Phone.TYPE??
  16. };??
  17. public?static?final?int?COL_PHONE_NUMBER?=?0;??
  18. public?static?final?int?COL_PHONE_NAME?=?1;??
  19. public?static?final?int?COL_PHONE_TYPE?=?2;??
  20. ??
  21. ??
  22. public?void?getContactList()?{??
  23. ????String?select?=?"(("?+?Contacts.DISPLAY_NAME?+?"?NOTNULL)?AND?("??
  24. ???????+?Contacts.HAS_PHONE_NUMBER?+?"=1)?AND?("??
  25. ???????+?Contacts.DISPLAY_NAME?+?"?!=?''?))";??
  26. ??????
  27. ????list?=?new?ArrayList<ContactItemData>();??
  28. ????Cursor?cursor?=?this.getContentResolver().query(??
  29. ????????????ContactsContract.Contacts.CONTENT_URI,?selectCol,?select,?null,???
  30. ????????????ContactsContract.Contacts.DISPLAY_NAME?+?"?COLLATE?LOCALIZED?ASC");??
  31. ????if?(cursor?==null)?{??
  32. ????????Toast.makeText(this,?"cursor?is?null!",?Toast.LENGTH_LONG).show();??
  33. ????????return;??
  34. ????}??
  35. ????if?(cursor.getCount()?==?0)?{??
  36. ????????Toast.makeText(this,?"cursor?count?is?zero!",?Toast.LENGTH_LONG).show();??
  37. ????????return;??
  38. ????}??
  39. ??????
  40. ??????
  41. ????cursor.moveToFirst();??
  42. ????while(!cursor.isAfterLast())?{??
  43. ????????int?contactId;??
  44. ????????contactId?=?cursor.getInt(cursor.getColumnIndex(??
  45. ????????????ContactsContract.Contacts._ID));??
  46. ????????if?(cursor.getInt(COL_HAS_PHONE)>0)?{??
  47. ????????????//?the?contact?has?numbers??
  48. ????????????//?获得联系人的电话号码列表??
  49. ????????????String?displayName;??
  50. ????????????displayName?=?cursor.getString(COL_NAME);??
  51. ???????????????Cursor?phoneCursor?=?getContentResolver().query(??
  52. ???????????????????????ContactsContract.CommonDataKinds.Phone.CONTENT_URI,??
  53. ???????????????????????selPhoneCols,??
  54. ???????????????????????ContactsContract.CommonDataKinds.Phone.CONTACT_ID??
  55. ???????????????????????????????+?"="?+?contactId,?null,?null);??
  56. ???????????????if(phoneCursor.moveToFirst())?{??
  57. ???????????????????do???
  58. ???????????????????{??
  59. ???????????????????????//遍历所有的联系人下面所有的电话号码??
  60. ???????????????????????String?phoneNumber?=?phoneCursor.getString(COL_PHONE_NUMBER);??
  61. ??
  62. ???????????????????????ContactItemData?data?=?new?ContactItemData();??
  63. ???????????????????????String?phoneFiled?=?new?String();??
  64. ???????????????????????data.name?=?displayName;??
  65. ???????????????????????data.number?=?phoneFiled?+?":"?+?phoneNumber;??
  66. ???????????????????????data.check?=?false;??
  67. ???????????????????????list.add(data);??
  68. ???????????????????}while(phoneCursor.moveToNext());??
  69. ???????????????}??
  70. ????????}??
  71. ????????cursor.moveToNext();??
  72. ????}??
  73. }??


读取所有号码的片段:

?

?

[java]?view plaincopy
?
  1. /**?
  2. ?*?Yao.GUET?
  3. ?*?Blog:?http://blog.csdn.net/Yao_GUET?
  4. ?*/??
  5. //?the?selected?cols?for?phones?numbers??
  6. String[]?selPhoneCols?=?new?String[]?{??
  7. ????????ContactsContract.CommonDataKinds.Phone.NUMBER,??
  8. ????????ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,??
  9. ????????ContactsContract.CommonDataKinds.Phone.TYPE,??
  10. ????????ContactsContract.CommonDataKinds.Phone.LABEL,??
  11. ????????ContactsContract.CommonDataKinds.Phone._ID??
  12. };??
  13. public?static?final?int?COL_PHONE_NUMBER?=?0;??
  14. public?static?final?int?COL_PHONE_NAME?=?1;??
  15. public?static?final?int?COL_PHONE_TYPE?=?2;??
  16. public?static?final?int?COL_PHONE_LABEL?=?3;??
  17. ??
  18. public?ContactsCursorAdapter?getContactCursorList()?{??
  19. ????????String?select?=?"(("?+?Contacts.DISPLAY_NAME?+?"?NOTNULL)?AND?("??
  20. ????????+?Contacts.DISPLAY_NAME?+?"?!=?''?)?AND?("??
  21. ????????+?ContactsContract.CommonDataKinds.Phone.NUMBER?+?"?NOTNULL)?AND?("??
  22. ????????+?ContactsContract.CommonDataKinds.Phone.NUMBER?+?"?!=?''))";??
  23. ??????????
  24. ????????Cursor?cursor?=?this.getContentResolver().query(??
  25. ????????????????ContactsContract.CommonDataKinds.Phone.CONTENT_URI,???
  26. ????????????????selPhoneCols,?select,?null,??
  27. ????????????????"sort_key_alt"??
  28. ????????????????);??
  29. ????????ContactsCursorAdapter?adapter?=?new?ContactsCursorAdapter(this,???
  30. ????????????????R.layout.contact_item,?cursor);??
  31. ????????return?adapter;??
  32. } ?

?

  相关解决方案