安卓笔记之读取联系人和写入联系人
来源:互联网 发布:淘宝什么小类目好做 编辑:程序博客网 时间: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,其他数据依然保留。
- 安卓笔记之读取联系人和写入联系人
- 读取联系人和添加联系人
- 安卓选择通讯录联系人和获取全部联系人
- 安卓选择通讯录联系人和获取全部联系人
- 安卓获取手机联系人和号码
- 安卓使用ContentProvider实现读取手机联系人和短信内容
- 安卓使用ContentProvider实现读取手机联系人和短信内容
- 安卓学习笔记之获取安卓手机联系人
- Android-查询联系人和增加联系人
- 查询手机联系人和sim卡联系人
- Android学习笔记:访问和添加通讯录中的联系人和联系人数据库表简介一
- Android学习笔记---22_访问通信录中的联系人和添加联系人,使用事物添加联系人...
- Android开发入门之访问通讯录中的联系人和添加联系人
- android中读取联系人和通话记录
- android中读取联系人和通话记录
- ContentProvider往通讯录添加联系人和获取联系人
- ContentProvider往通讯录添加联系人和获取联系人
- 十四、ContentProvider往通讯录添加联系人和获取联系人
- 黑马程序员---Objective-C Protocol
- Java-----8、泛型
- Jsp9个内置对象详解
- P122.36
- android sdk loader的问题
- 安卓笔记之读取联系人和写入联系人
- SQL语句执行流程与顺序原理解析
- Python正则表达式
- this.getsession和this.getHibernateTemplate().getSessionFactory().getCurrentSession()/OpenSession区别
- JAVA 反射 总结 之 动态代理
- Redis入门
- CSU 1620 A Cure for the Common Code (HASH+区间DP)
- Cocos2d-x加载CocoStudio导出文件的配置
- 阿里巴巴、百度Android实习生,面试之旅(上)