首页 > 代码库 > 【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基础】读取系统联系人信息和添加一条联系人信息到通讯录