现在的位置: 首页 > 综合 > 正文

【contacts】Phonebook电话本

2017年12月05日 ⁄ 综合 ⁄ 共 3396字 ⁄ 字号 评论关闭

http://developer.android.com/intl/zh-CN/reference/packages.html

访问电话本权限

Android的应用程序AndroidManifest.xml中加入:<uses-permission android:name="android.permission.READ_CONTACTS"/> 权限

联系人存放的数据库

Android中的联系人都保存在一个SQLite数据库中,它的路径为:/data/data/com.android.providers.contacts/databases/contacts2.db

contacts2.db的简单介绍可访问:http://hi.baidu.com/_sherry_liu/item/50431e38bef2c24e033edc9b

在联系人数据库中,保存的都是一些小的数据表,即与把所有数据保存成一个表不同,它会对联系人的资料模块化,然后分成多个表保存。
表与表之间使用id相关联起来,这样做的目的是尽量减小数据表的规模,提高数据检索的速度,因为我们检索的时候不是每次都需要读取所有的联系人资料的,这样可以更灵活的选择我们所关心的内容,提高检索速度, 虽然分开的保存数据,可以提高检索的速度,但是也给我们带来了一些不便,就是需要把这些分开的表再重新联合起来,组成我们所需要的完整的数据。
好在这些,android已经替我们准备好了,它在数据库里面建了一些视图。并且,android也提供了很多接口,通过ContentResolver().query方法,传入不同的URI即可访问相应的数据集。
在联系人数据库里面联系人和电话号码是分别存在两个表里面的,因为存在一个联系人拥有几个号码的情况,所以android为联系人和手机号码分别单独创建了相应的视图。
联系人信息的视图里面只保存与联系人相关的资料,例如姓名,是否有手机号码等。 而手机号码资料则是每一个电话号码为一条记录,如果有一个联系人有3个号码,则里面会出现3个该联系人的记录,号码分别为他的三个号码。
如果是需要读取联系人信息,传入的URI为:ContactsContract.Contacts.CONTENT_URI
如果是需要读取手机号码信息传入的URI为:ContactsContract.CommonDataKinds.Phone.CONTENT_URI

电话本访问应用到的类

Cursor类:
android.database.Cursor:
http://developer.android.com/intl/zh-CN/reference/android/database/Cursor.html
关于Cursor的重要方法:

  • close() 关闭游标,释放资源
  • copyStringToBuffer(int columnIndex, CharArrayBuffer buffer) 在缓冲区中检索请求的列的文本,将其存储
  • getColumnCount() 返回所有列的总数
  • getColumnIndex(String columnName) 返回指定列的名称,如果不存在返回-1
  • getColumnIndexOrThrow(String columnName) 从零开始返回指定列名称,如果不存在将抛出IllegalArgumentException 异常。
  • getColumnName(int columnIndex) 从给定的索引返回列名
  • getColumnNames() 返回一个字符串数组的列名
  • getCount() 返回Cursor 中的行数
  • moveToFirst() 移动光标到第一行
  • moveToLast() 移动光标到最后一行
  • moveToNext() 移动光标到下一行
  • moveToPosition(int position) 移动光标到一个绝对的位置
  • moveToPrevious() 移动光标到上一行

Contacts类:
android.provider.ContactsContract.Contacts:
http://developer.android.com/intl/zh-CN/reference/android/provider/ContactsContract.Contacts.html
关联存储联系人的数据表,每个记录集代表一个联系人。Contacts类定义的常量,包含了联系人表的所有列。

ContentResolver类:
android.content.ContentResolver:
http://developer.android.com/intl/zh-CN/reference/android/content/ContentResolver.html
说明:当外部应用需要数据进行添加、删除、修改和查询操作时,需要使用ContentResolver 类来完成。
关于Cursor的重要方法:

  • public Uri insert(Uri uri, ContentValues values)  该方法用于添加数据。 
  • public int delete(Uri uri, String selection, String[] selectionArgs) 该方法用于删除数据。 
  • public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) 该方法用于更新数据。 
  • public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) 该方法用于获取数据。
    projection:是需要读取的字段
    selection:是数据检索的条件
    selectionArgs:是数据检索条件的参数
    sortOrder:是排序的字段

Phone类:
android.provider.ContactsContract.CommonDataKinds.Phone:
http://developer.android.com/intl/zh-CN/reference/android/provider/ContactsContract.CommonDataKinds.Phone.html
关联电话号码数据表, 定义了查询电话号码的Url

代码逻辑

  • 首先,通过Activity的getContentResolver()得到ContentResolver的实例,检索联系人数据表。
    通过url指明检索的数据表,其他参数指明检索的条件等
    Cursor cursor = getContentResolver().query(uri,projection,selection,selectionArgs,sortOrder)

    检索条件是很重要的,我们只想取得联系人的相关信息该怎么指明检索条件呢?

    //指明联系人姓名不能为空,并且有电话号码的联系人
    String select = "((" + Contacts.DISPLAY_NAME + " NOTNULL) AND (" 
                    + Contacts.HAS_PHONE_NUMBER + "=1) AND (" + Contacts.DISPLAY_NAME + " != '' ))";

    其他参数,如返回字段,结果的排序等,根据实际情况传入自己的设定。

  • 其次,通过游标遍历cursor数组,取得每个联系人的id等
    cursor.moveToFirst();
    while (!cursor.isAfterLast()) {... }
  • 再次,用取得的联系人id为条件,检索该联系人的所有电话号码,再进行遍历取得每一个电话号码。
    //根据每个联系人的Id,取得该联系人的所有电话号码
    Cursor phoneCursor = activity.getContentResolver().query(
                            ContactsContract.CommonDataKinds.Phone.CONTENT_URI, selPhoneCols,
                            ContactsContract.CommonDataKinds.Phone.CONTACT_ID + "=" + contactId, null,
                            null);
  • 最后,关闭游标数组,释放资源。

抱歉!评论已关闭.