首页 > 代码库 > 【android基础】读取系统联系人信息和添加一条联系人信息到通讯录

【android基础】读取系统联系人信息和添加一条联系人信息到通讯录

一,读取系统联系人信息

I,准备工作

同样,要读取系统联系人的数据库文件,首先要确定主机名和匹配规则。

我们将联系人的数据库文件导出来查看时,有下面几点需要知道:

1)联系人的数据,比如name,number,email都存储在data表的data1列。

2)区分不同联系人的列为raw_contact_id,它对应于raw_contacts表中的contact_id列

3)区分联系人数据类型的列位于mimetype列,其中1表示emial,5表示电话,7表示姓名。

 

II,思路

读取联系人的信息,也就是读取data表中的姓名,电话,邮箱。

难道这样写:select * from data.

上面的SQL语句是查找出整张表,我们应该根据标识联系人的id来查找每个联系人的数据。

所以,首先要查询raw_contacts表中的contact_id,再根据id去data表中进行where。

1   ContentResolver resolver=getContentResolver();2          Uri uri=Uri.parse("content://com.android.contacts/raw_contacts");3          Uri dataUri=Uri.parse("content://com.android.contacts/data");4       Cursor cursor=resolver.query(uri, null, null, null, null);5      while(cursor.moveToNext()){6              String id=cursor.getString(cursor.getColumnIndex("contact_id"));7           }

获取到id后就可以根据id在data表中查询数据,所以代码就很好写了:

 1 while(cursor.moveToNext()){ 2             String id=cursor.getString(cursor.getColumnIndex("contact_id")); 3             /** 4              *获取联系人的id后,就可以根据id来查询data表中的内容和类型 6               id不为null,表示该联系人还存在。不然的话,如果删除联系人,再去查找的话,就会发生空指针异常。 7              */ 8             if(id!=null){ 9                 Cursor dataCursor=resolver.query(dataUri, null, "raw_contact_id=?", new String[]{id}, null);10                 while(dataCursor.moveToNext()){11                     String data=http://www.mamicode.com/dataCursor.getString(dataCursor.getColumnIndex("data1"));12                     String mimetype=dataCursor.getString(dataCursor.getColumnIndex("mimetype"));13                     System.out.println(data+"  "+mimetype);14                 }15             }16             17         }            

为什么会发生空指针异常?

删除某个联系人后,该联系人在raw_contacts表中的id为null,但是相关的数据并没有在data表中被删除。所以,如果不判断id是否为空,程序就会用null去data表中去查询数据。

那为什么删除联系人不删除data表中的数据呢?

删除联系人,只是把联系人的id标记为空,这样做有个好处:因为这些联系人都需要上传到服务器的,等到你因刷机等各种原因导致通讯录丢失,还可以还原回来。
假如你在离线的时候,也就是没和服务器连接的时候,删除联系人。等到有网时,服务器要花费很多时间来得知哪一个联系人被删除了。

这时,只要把id置为null,就很方便知道是什么联系人被删除。

 

二,添加联系人到通讯录中

I,思路

要想添加联系人的信息到data表中,最关键的就是获取这个联系人的raw_contacts表中的contact_id。

这个id值,就是最后一个id加1.

所以代码有:

 1         ContentResolver resolver=getContentResolver(); 2         Uri uri=Uri.parse("content://com.android.contacts/raw_contacts"); 3         Uri datauri=Uri.parse("content://com.android.contacts/data"); 4          5         /** 6          * 要想往raw_contact表中添加id,则必须知道该表中最后一个联系人的id 7          */ 8          9         //第二个参数表示的是内容10         Cursor cursor=resolver.query(uri, new String[]{"_id"}, null, null, null);11         //游标移到最后一行12         cursor.moveToLast();13         //获取最后一个联系人的id14         int oldID=cursor.getInt(cursor.getColumnIndex("_id"));15         16         int newID=oldID+1;17         ContentValues values=new ContentValues();18         values.put("contact_id", newID);
      resolver.insert(uri, values);

再raw_contacts表中添加新的id后,就可以利用这个id,往data表中添加联系人的数据。

 1 //使用联系人添加的id,向data表中插入数据 2         //添加号码 3         ContentValues phonevalues=new ContentValues(); 4         phonevalues.put("data1","88888"); 5         phonevalues.put("mimetype","vnd.android.cursor.item/phone_v2"); 6         phonevalues.put("raw_contact_id", newID); 7         resolver.insert(datauri, phonevalues); 8          9         //添加姓名10         ContentValues namevalues=new ContentValues();11         namevalues.put("data1","oooo");12         namevalues.put("mimetype","vnd.android.cursor.item/name");13         namevalues.put("raw_contact_id", newID);14         resolver.insert(datauri, namevalues);15         16         //添加邮箱17         ContentValues emailvalues=new ContentValues();18         emailvalues.put("data1","wcx@163.com");19         emailvalues.put("mimetype","vnd.android.cursor.item/email_v2");20         emailvalues.put("raw_contact_id", newID);21         resolver.insert(datauri, emailvalues);22         23         Toast.makeText(this, "添加联系人成功", 0).show();

 

【android基础】读取系统联系人信息和添加一条联系人信息到通讯录