安卓笔记之读取联系人和写入联系人

来源:互联网 发布:淘宝什么小类目好做 编辑:程序博客网 时间:2024/05/22 15:27

1.联系人的信息保存在data/data/下的


2.联系人数据库常用的表以及常用的列

①raw_contacts表  contact_id列表示联系人id

②data表  raw_contact_id列出了联系人所对应的所有信息;mimetype_id列出了信息所对应的类型

③mimetypes表  mimetype列出了mimetype_id对应的具体信息类型

3.需在配置文件中添加如下权限:

 <uses-permission android:name="android.permission.WRITE_CONTACTS"/>
 <uses-permission android:name="android.permission.READ_CONTACTS"/>



//读取联系人

4.在工程中添加一个按钮,添加如下点击事件

public void click(View v) {
//获得中间人
ContentResolver resolver = getContentResolver();
//根据raw_contacts表中的contact_id列获得联系人id
Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");
//根据data表中的raw_contact_id列获得对应的data1、mimetype
Uri datauri = Uri.parse("content://com.android.contacts/data");
Cursor cursor = resolver.query(uri, null, null, null, null);
while(cursor.moveToNext()){
String id=cursor.getString(cursor.getColumnIndex("contact_id"));
System.out.println(id);
Cursor datacursor=resolver.query(datauri, null, "raw_contact_id=?", new String[]{id}, null);
while(datacursor.moveToNext()){
String data1=datacursor.getString(datacursor.getColumnIndex("data1"));
String mimetype=datacursor.getString(datacursor.getColumnIndex("mimetype_id"));
System.out.println("data1"+data1);
System.out.println("mimetype_id"+mimetype);
}

}


}

运行后报错

错误位置:String mimetype=datacursor.getString(datacursor.getColumnIndex("mimetype_id"));

错误原因:查询不到data表中mimetype_id,因此返回-1;

其实查询的是data表和mimetypes表一起生成的view_data视图

解决办法:

①//获得datacursor查询的所有的列
String[] names=datacursor.getColumnNames();

然后即可知道获得mimetype_id列

②更改代码

while(datacursor.moveToNext()){
String data1=datacursor.getString(datacursor.getColumnIndex("data1"));
String mimetype=datacursor.getString(datacursor.getColumnIndex("mimetype"));//红色部分为标记
System.out.println("data1: "+data1);
System.out.println("mimetype: "+mimetype);
}


//新建联系人

public void click(View v) {
ContentResolver resolver = getContentResolver();
// 在raw_contacts表添加contact_id,因此需要知道raw_contacts表有多少条数据
Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");
ContentValues values = new ContentValues();
Cursor cursor = resolver.query(uri, new String[]{"_id"}, null, null, null);
cursor.moveToLast();// 移动到最后一条记录
int id = cursor.getInt(0);// 取得第0列(主键)的内容
int newid = id + 1;

values.put("contact_id", newid);
resolver.insert(uri, values);


// 使用添加的联系人的id向data表中插入信息
Uri datauri = Uri.parse("content://com.android.contacts/data");
// 插入号码信息
ContentValues phonevalues = new ContentValues();
phonevalues.put("data1", phone.getText().toString() );
phonevalues.put("mimetype", "vnd.android.cursor.item/phone_v2");
phonevalues.put("raw_contact_id", newid);
resolver.insert(datauri, phonevalues);
// 插入名字信息
ContentValues namevalues = new ContentValues();
namevalues.put("data1", name.getText().toString());
namevalues.put("mimetype", "vnd.android.cursor.item/name");
namevalues.put("raw_contact_id", newid);
resolver.insert(datauri, namevalues);
// 插入邮件信息
ContentValues emailvalues = new ContentValues();
emailvalues.put("data1",email.getText().toString());
emailvalues.put("mimetype", "vnd.android.cursor.item/email_v2");
emailvalues.put("raw_contact_id", newid);
resolver.insert(datauri, emailvalues);


Toast.makeText(MainActivity.this, "保存成功", Toast.LENGTH_SHORT).show();
}


一些细节:

删除联系人后,再运行读取联系人中的代码

String id=cursor.getString(cursor.getColumnIndex("contact_id"));
System.out.println(id);

抛出异常

原因:此时的raw_contacts表中的contact_id有一项置为null了。

总结:删除联系人的时候并没有真正把该联系人所对应的信息从数据库删掉,只是将他的contact_id置为null,其他数据依然保留。












0 0
原创粉丝点击