【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=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         //获取最后一个联系人的id
14         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","[email protected]");
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();

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。