Android操作联系人
来源:互联网 发布:手机淘宝闲置怎么用 编辑:程序博客网 时间:2024/05/22 13:04
在Content Provider中查询数据,需要知道以下信息
- 标识该Content Provider的URI
- 需要查询的数据字段的名称
- 字段中数据的类型
- 如果需要查询特定记录,name还需要知道该记录的ID值
ContentResolver.query()或 Activity.ManagedQuery()方法都可以完成查询功能,这两个方法使用的参数相同,都返回Cursor对象,其区别在于managedQeury()方法是Activity来管理Cursor生命周期。而Query()方法则需要程序员自己管理。
声明方式如下
contentResolver.query(uri, projection, selection, selectionArgs, sortOrder)
Uri:用于查询的Content Provider URI值
projection:由需要查询的列名组成的数组
selection:类似SQL中的where子句,用于增加条件来完成数据过滤
selectionArgs:用于替换selection中可以使用?表示的表示的变量值
sortOrder:类似SQL中的 ORDER BY子句,用于实现排序的功能
返回值:Cursor对象,它位于第一条记录之前,或者为null
步骤:
加入权限
<uses-permission android:name="android.permission.READ_CONTACTS"/> <uses-permission android:name="android.permission.WRITE_CONTACTS"/>
- 找出相关的URI
public static Uri uri_raw_contacts = Uri.parse("content://com.android.contacts/raw_contacts"); private static Uri uri_raw_contacts_ = ContactsContract.Contacts.CONTENT_URI; // 和上面等价 public static Uri uri_data = Uri.parse("content://com.android.contacts/data"); public static Uri uri_data_ = ContactsContract.Data.CONTENT_URI;
查询代码
- 查询出raw_contact表中的内容,把_id放到集合中
- 根据查出的_id到data里面查询相关的数据
- 根据data表里mimetype_id取查询数据
- 查询完成后把数据添加到集合中
如:
public static List<Map<String, Object>> queryAllContacts( ContentResolver resolver) { List<Map<String, Object>> list = new ArrayList<Map<String, Object>>(); Cursor c1 = resolver.query(uri_raw_contacts, null, null, null, null); while (c1.moveToNext()) { Map<String, Object> map = new HashMap<String, Object>(); int _id = c1.getInt(c1.getColumnIndex("_id"));// 从data表中取出记录的_id编号 map.put("_id", _id);// 存放到map里面 // 查找data表 Cursor c2 = resolver.query(uri_data, new String[] { "data1", "mimetype" }, "raw_contact_id = ?", new String[] { _id + "" }, null); // 通过指定的_id找该联系人的所有数据 while (c2.moveToNext()) { // 获取名字,电话号码, email String data1 = c2.getString(c2.getColumnIndex("data1")); String mimetype = c2.getString(c2.getColumnIndex("mimetype")); //这儿得到的是mimetype的类型是string 而不是int if (mimetype.equals("vnd.android.cursor.item/name"))// 取出存放的电话号码的名字 这儿取出的类型是是字符串 { map.put("name", data1); } else if (mimetype.equals("vnd.android.cursor.item/phone_v2")) { if (!map.containsKey("phone"))// 第一次放的时候 { map.put("phone", data1); } else// 第二次放的时候 { String p = map.get("phone").toString(); map.put("phone", p + "&&" + data1); } } else if (mimetype.equals("vnd.android.cursor.item/email_v2"))// 取出邮件 { if (!map.containsKey("email"))// 第一次放的时候 { map.put("email", data1); } else// 第二次放的时候 { String p = map.get("email").toString(); map.put("email", p + "&&" + data1); } } } list.add(map); } return list;}
注意:ContentResolver是在Activity或Fragment里面使用getContentResolver()得到的
添加数据
public static void addContact(ContentResolver contentResolver, MyContacts c) { // 先向raw_contact里面插入数据 ContentValues values = new ContentValues(); Uri newUri = contentResolver.insert(uri_raw_contacts, values); // 得到生成的ID long _id = ContentUris.parseId(newUri); // 然后用这个ID向data表里面插入数据 values.clear(); values.put("raw_contact_id", _id); values.put("data1", c.getName()); values.put("data2", c.getName()); // 定义类型 values.put("mimetype", "vnd.android.cursor.item/name"); contentResolver.insert(uri_data, values); // 插入电话号码 values.clear(); values.put("raw_contact_id", _id); values.put("data1", c.getPhone()); values.put("mimetype", "vnd.android.cursor.item/phone_v2"); contentResolver.insert(uri_data, values); // 插入邮箱 values.clear(); values.put("raw_contact_id", _id); values.put("data1", c.getEmail()); values.put("mimetype", "vnd.android.cursor.item/email_v2"); contentResolver.insert(uri_data, values);}
修改数据
public static void updateContact(ContentResolver contentResolver, MyContacts c) { // 先向raw_contact里面插入数据 ContentValues values = new ContentValues(); // 是新录入的数据(只要和名字有关的都要进行修改) values.put("display_name", c.getName()); values.put("display_name_alt", c.getName()); values.put("sort_key", c.getName()); values.put("sort_key_alt", c.getName()); contentResolver.update(uri_raw_contacts, values, "_id=?", new String[] { c.getId() + "" }); // 修改data表 values.clear(); values.put("data1", c.getName()); values.put("data2", c.getName()); contentResolver.update(uri_data, values, "mimetype = ? and raw_contact_id = ?", new String[] { "vnd.android.cursor.item/name", c.getId() + "" });// 确定正确raw_contact_id,区分类型 // 修改电话号码 values.clear(); values.put("data1", c.getPhone()); // values.put("data2", Phone.TYPE_HOME); contentResolver.update(uri_data, values,"mimetype = ? and raw_contact_id = ?",new String[] { "vnd.android.cursor.item/phone_v2",c.getId() + "" });// 确定正确raw_contact_id,区分类型 // 修改电话邮箱 values.clear(); values.put("data1", c.getEmail()); // values.put("data2", Email.TYPE_WORK); contentResolver.update(uri_data, values,"mimetype = ? and raw_contact_id = ?",new String[] { "vnd.android.cursor.item/email_v2",c.getId() + "" });// 确定正确raw_contact_id,区分类型 System.out.println("------------修改成功");}
读取通话记录
public static Cursor getAllCalls(ContentResolver resolver) { Uri uri = Uri.parse("content://call_log/calls"); System.out.println(CallLog.Calls.CONTENT_URI); // 第三个参数和第五个参数的关键字就不用写了 Cursor c = resolver.query(uri, new String[] { "_id", "number", "date", "duration" }, // 返回指定的列,如果填写null返回该表中所有的列 ,列的信息填写到String[] null, // where条件的参数"date=?,duration>?" null, // where条件参数?对应的具体的集合new String[]{"2012-01-01","1*60*1000"} "date desc" // 排序"date desc" ); return c;}/** * 根据不同的类型获取电话记录 type:通话类型 (1、来电记录; 2、呼出记录; 3、未接电话) * * @return */public static Cursor getCallsType(ContentResolver resolver, int type) { Uri uri = Uri.parse("content://call_log/calls"); // 第三个参数和第五个参数的关键字就不用写了 Cursor c = resolver.query(uri, new String[] { "_id", "number", "date", "duration", "type" }, // 返回指定的列,如果填写null返回该表中所有的列 ,列的信息填写到String[] "type = ?", // where条件的参数"type =?" new String[] { type + "" }, // where条件参数?对应的具体的集合new String[]{"2"} "date desc" // 排序"date desc" ); return c;}
读取短信
class SMSHelper { /** * 查询所有短消息的信息 * * @param resolver * @return */ public static Cursor getAllMsgs(ContentResolver resolver) { Uri uri = Uri.parse("content://sms/"); return resolver.query(uri, new String[] { "_id", "address", "body", "date" }, null, null, "date desc"); } /** * 获取thread视图表的数据 */ public static Cursor getThreadMsgs(ContentResolver resolver) { // (* from threads --) Uri uri = Uri.parse("content://sms/"); return resolver.query(uri, new String[] { "* from threads --" }, // 默认写 *就是所有列 null, null, "date desc"); } /** * 通过thread_id获取电话号码 */ public static String getAddressByThread_id(ContentResolver resolver, int thread_id) { String address = null; Uri uri = Uri.parse("content://sms/"); Cursor c = resolver.query(uri, new String[] { "address" }, "thread_id = ?", new String[] { thread_id + "" }, null); if (c.moveToNext()) { address = c.getString(c.getColumnIndex("address")); } return address; } /** * 查询没有读取短消息的信息 * * @param resolver * @return */ public static Cursor getUnReadMsgs(ContentResolver resolver) { Uri uri = Uri.parse("content://sms/"); return resolver.query(uri, new String[] { "_id", "address", "body", "date" }, "read = ?", new String[] { "0" }, "date desc"); }}
0 0
- Android操作联系人
- Android操作联系人
- Android操作联系人
- android操作联系人Contacts
- Android简单联系人操作
- Android 简单联系人操作
- Android之联系人操作
- android联系人操作
- android操作联系人
- Android操作联系人
- Android操作联系人
- Android通讯录联系人操作
- android操作联系人Contacts
- Android操作联系人
- Android:操作联系人
- Android操作联系人
- Android 联系人数据库操作
- Android联系人读取操作笔记
- 感知机学习笔记
- 去掉 URL 中的 index.php
- Android动画总结
- Android 中加载v4包里面的fragment
- 两个变量如何交换值
- Android操作联系人
- 排序算法
- 鸟哥的Linux私房菜(基础篇)-第五章、首次登陆与在线求助 man page
- 设置 QComboBox的下拉框Item高度
- Android QLite 分页查询 增删改查
- 原始 XML 的读写
- Java半角全角文字转换
- no cortex-m sw device found
- 预编译头文件(stdafx.h)的原理