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