原文地址:http://blog.csdn.net/xingfeng2010/article/details/11810335

一、 联系人数据库
 联系人的数据库文件的位置
/data/data/com.android.providers.contacts/databases.contacts2.db
 数据库中重要的几张表
1、contacts表
该表保存了所有的手机测联系人,每个联系人占一行,该表保存了联系人的
ContactID、联系次数、最后一次联系的时间、是否含有号码、是否被添加
到收藏夹等信息。
2、raw_contacts表
该表保存了所有创建过的手机测联系人,每个联系人占一行,表里有一列标
识该联系人是否被删除,该表保存了两个ID:RawContactID和ContactID,
从而将contacts表和raw_contacts表联系起来。该表保存了联系人的
RawContactID、ContactID、联系次数、最后一次联系的时间、是否被添
加到收藏夹、显示的名字、用于排序的汉语拼音等信息。

3、 mimetypes
该表定义了所有的MimeTypeID,即联系人的各个字段的唯一标志。

4、data表
 该表保存了所有创建过的手机测联系人的所有信息,每个字段占一行 ,该表
保存了两个ID:MimeTypeID和RawContactID,从而将data表和
raw_contacts表联系起来。
 联系人的所有信息保存在列data1至data15中,各列中保存的内容根据
MimeTypeID的不同而不同。如保存号码(MimeTypeID=5)的那行数据中,
data1列保存号码,data2列保存号码类型(手机号码/家庭号码/工作号码等)。


二、对联系人的基本操作
 这里的基本操作只是针对手机测的联系人,(U)SIM侧的联系人的操
作后续介绍。
 如果对联系人的基本操作,我们必须得到许可。
方法就是在AndroidManifest.xml文件中配置如下权限:
<uses-permission android:name="android.permission.READ_CONTACTS"
/>
<uses-permission android:name="android.permission.WRITE_CONTACTS"
/>

读取联系人
分为以下步骤:
1、先读取contacts表,获取ContactsID;
2、再在raw_contacts表中根据ContactsID获取RawContactsID;
3、然后就可以在data表中根据RawContactsID获取该联系人的各数据了。

[html] view plain copy
  1. //获取用来操作数据的类的对象,对联系人的基本操作都是使用这个对象
  2. ContentResolvercr=getContentResolver();
  3. //查询contacts表的所有记录
  4. Cursorcur=cr.query(ContactsContract.Contacts.CONTENT_URI,null,null,
  5. null,null);
  6. //如果记录不为空
  7. if(cur.getCount()>0)
  8. {
  9. //游标初始指向查询结果的第一条记录的上方,执行moveToNext函数会判断
  10. //下一条记录是否存在,如果存在,指向下一条记录。否则,返回false。
  11. while(cur.moveToNext())
  12. {
  13. StringrawContactsId="";
  14. Stringid=
  15. cur.getString(cur.getColumnIndex(ContactsContract.Contacts._ID));
  16. str+="ID:"+id+"\n";二、对联系人的基本操作(4)
  17. //读取rawContactsId
  18. CursorrawContactsIdCur=cr.query(RawContacts.CONTENT_URI,
  19. null,
  20. RawContacts.CONTACT_ID+"=?",
  21. newString[]{id},null);
  22. //该查询结果一般只返回一条记录,所以我们直接让游标指向第一条记录
  23. if(rawContactsIdCur.moveToFirst())
  24. {
  25. //读取第一条记录的RawContacts._ID列的值
  26. rawContactsId=
  27. rawContactsIdCur.getString(rawContactsIdCur.getColumnIndex(
  28. RawContacts._ID));
  29. }
  30. rawContactsIdCur.close();
[html] view plain copy
  1. //读取号码
  2. If(Integer.parseInt(cur.getString(cur.getColumnIndex(ContactsContract.
  3. Contacts.HAS_PHONE_NUMBER)))>0)
  4. {
  5. //根据查询RAW_CONTACT_ID查询该联系人的号码
  6. CursorPhoneCur=
  7. cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
  8. null,
  9. ContactsContract.CommonDataKinds.Phone.RAW_CONTACT_ID+"=
  10. ?",
  11. newString[]{rawContactsId},null);
  12. //上面的ContactsContract.CommonDataKinds.Phone.CONTENT_URI
  13. //可以用下面的phoneUri代替
  14. //UriphoneUri=Uri.parse("content://com.android.contacts/data/phones");二、对联系人的基本操作(6)
  15. //一个联系人可能有多个号码,需要遍历
  16. while(PhoneCur.moveToNext())
  17. {
  18. //号获取码
  19. Stringnumber=
  20. PhoneCur.getString(PhoneCur.getColumnIndex(
  21. ContactsContract.CommonDataKinds.Phone.NUMBER));
  22. //获取号码类型
  23. StringnumberType=
  24. PhoneCur.getString(PhoneCur.getColumnIndex(
  25. ContactsContract.CommonDataKinds.Phone.TYPE));
  26. }
  27. PhoneCur.close();

新建联系人
新建联系人时, 根据contacts、raw_ contacts两张表中ID的使用情况,自动
生成ContactID和RawContactID。
Android源码新建重复姓名的联系人的ContactID是不重复的,所以会重复显
示。
用下面的代码新建联系人,如果多次新建的联系人的姓名是一样的,生成的
ContactID也会重复,RawContactID不会重复,我们在读取联系人的时候可
以获取所有同姓名联系人的号码等信息,在显示联系人的时候,重复姓名的
联系人的所有字段信息都会合并起来显示为一个联系人。

[html] view plain copy
  1. ContentValuesvalues=newContentValues();
  2. UrirawContactUri=
  3. getContentResolver().insert(RawContacts.CONTENT_URI,values);
  4. longrawContactId=ContentUris.parseId(rawContactUri);二、对联系人的基本操作(8)
  5. //向data表插入姓名数据
  6. if(name!="")
  7. {
  8. values.clear();
  9. values.put(Data.RAW_CONTACT_ID,rawContactId);
  10. values.put(Data.MIMETYPE,
  11. StructuredName.CONTENT_ITEM_TYPE);
  12. values.put(StructuredName.GIVEN_NAME,name);
  13. getContentResolver().insert(ContactsContract.Data.CONTENT_URI,
  14. values);
  15. }
  16. //向data表插入电话数据
  17. if(phoneNum!="")
  18. {
  19. values.clear();
  20. values.put(Data.RAW_CONTACT_ID,rawContactId);
  21. values.put(Data.MIMETYPE,Phone.CONTENT_ITEM_TYPE);
  22. values.put(Phone.NUMBER,phoneNum);
  23. values.put(Phone.TYPE,Phone.TYPE_MOBILE);
  24. getContentResolver().insert(ContactsContract.Data.CONTENT_URI,
  25. values);
  26. }


 删除联系人
Android帮助文档:When a raw contact is deleted, all of its Data rows as
well as StatusUpdates, AggregationExceptions, PhoneLookup rows are
deleted automatically.
所以,要删除联系人,我们只需要将raw_contacts表中指定RawContactID的
行删除,其他表中与之关联的数据都会自动删除。

[html] view plain copy
  1. publicvoiddelete(longrawContactId)
  2. {
  3. getContentResolver().delete(ContentUris.withAppendedId(RawContac
  4. ts.CONTENT_URI,rawContactId),null,null);
  5. }


 更新联系人
联系人的所有信息都是保存在data表中,所以要更新联系人,我们只需要根
据RawContactID和MIMETYPE修改data表中的内容。

[html] view plain copy
  1. ContentValuesvalues=newContentValues();
  2. values.put(Phone.NUMBER,“123");
  3. values.put(Phone.TYPE,Phone.TYPE_MOBILE);
  4. StringWhere=ContactsContract.Data.RAW_CONTACT_ID+"=?AND
  5. "+ContactsContract.Data.MIMETYPE+"=?";
  6. String[]WhereParams=newString[]{"5",Phone.CONTENT_ITEM_TYPE};
  7. getContentResolver().update(ContactsContract.Data.CONTENT_URI,
  8. values,Where,WhereParams);

更多相关文章

  1. android:SQLiteOpenHelper 与 greenDao 数据库操作
  2. Android(安卓)四种异步操作UI界面的方法
  3. Android中获取手机中的联系人信息
  4. Android(安卓)调用Android功能实现虚拟打电话程序
  5. Android(安卓)与SQlite 数据库操作(新手步骤)
  6. Android中,对SQLite的‘批处理’操作
  7. IOS多线程开发之GCD
  8. android 玩转ContentProvider之一--实现ContentProvider操作数据库
  9. 【Android】handler+message的简单用法

随机推荐

  1. android异常 android.os.NetworkOnMainTh
  2. Android:ERROR: Cause: com.android.build
  3. 视频演示索尼爱立信XPERIA X10
  4. Native method not found: com.baidu.pla
  5. ConstraintLayout使用心得以及几个需要注
  6. Netty UDP Server&Client
  7. 万能 dao 增删改查一个方法搞定
  8. android自定义View绘制几何图形
  9. 123123
  10. android定位服务:查看位置源及其属性