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;

查询代码

  1. 查询出raw_contact表中的内容,把_id放到集合中
  2. 根据查出的_id到data里面查询相关的数据
  3. 根据data表里mimetype_id取查询数据
  4. 查询完成后把数据添加到集合中
    如:
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
原创粉丝点击