对联系人进行增删改查

我已经将联系人操作的方法进行了封装,暴露了几个重要的方法,方便以后调用。

1. public void printContactsList() // 获取到的联系人列表(用于测试用)

2. public ArrayList<ContactBean> getContactsList() // 得到手机和SIM卡中的联系人列表(姓名 + 电话号码)

3. public void add(String name, String phoneNumber) // 添加一个新的联系人数据

4. public boolean delete(String name) // 删除单个联系人数据

5. public boolean update(String name, String phoneNumber) // 更新联系人数据

6. public boolean findNameByPhoneNumber(String phoneNumber) // 根据电话号码查询姓名

增删改查通讯录:http://blog.csdn.net/xiazdong/article/details/7713419

监听联系人的改变:http://www.eoeandroid.com/thread-234378-1-1.html

全部代码:

package com.kale.contatctest;

import java.util.ArrayList;
import java.util.Collection;

import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.provider.ContactsContract.CommonDataKinds.Phone;
import android.provider.ContactsContract.Contacts.Data;
import android.text.TextUtils;
import android.util.Log;
import android.widget.Toast;

public class ContactsManager {

    private Context mContext = null;

    public ContactsManager(Context context) {
        mContext = context;
    }

    /**
     * @description 打印获取到的联系人列表(用于测试用)
     *
     */
    public void printContactsList() {
        System.out.println("showContactsList----------------->" + getContactsList().size());
        for (int i = 0; i < getContactsList().size(); i++) {
            ContactBean cb = new ContactBean();
            cb = getContactsList().get(i);
            System.out.println(i + 1 + "  " + cb.getContactName() + "  " + cb.getPhoneNumber());
        }
    }

    /**
     * @description 得到手机和SIM卡中的联系人列表(姓名 + 电话号码)
     *
     * @return
     */
    public ArrayList<ContactBean> getContactsList() {
        ArrayList<ContactBean> contactsList = new ArrayList<ContactBean>();
        Collection<ContactBean> collection = getPhoneList();
        contactsList.addAll(collection);

        collection.clear();
        collection = getSIMList();
        contactsList.addAll(collection);

        return contactsList;
    }

    /**
     * 将“手机通讯录”联系人添加到list中
     */
    private ArrayList<ContactBean> getPhoneList() {
        Uri uri = Phone.CONTENT_URI;
        return getContactsList(uri);
    }

    /**
     * 将“手机SIM”联系人添加到list中
     */
    private ArrayList<ContactBean> getSIMList() {
        Uri uri = Uri.parse("content://icc/adn");
        return getContactsList(uri);
    }

    /**
     * @param uri
     * @return 根据URL来得到手机/SIM卡中的联系人列表
     */
    private ArrayList<ContactBean> getContactsList(Uri uri) {
        ArrayList<ContactBean> list = new ArrayList<ContactBean>();
        ContentResolver resolver = mContext.getContentResolver();
        /*
         * 获取库Phone表字段,仅仅获取电话号码联系
         * 它所指向的其实是“content://com.android.contacts/data/phones”。
         * 这个URL对应着contacts表 和 raw_contacts表 以及 data表 所以说我们的数据都是从这三个表中获取的。
         */
        String[] PHONES_PROJECTION = new String[] { Phone.DISPLAY_NAME, Phone.NUMBER, Phone.CONTACT_ID };
        Cursor phoneCursor = resolver.query(uri, PHONES_PROJECTION, null, null, null);
        if (phoneCursor != null) {
            while (phoneCursor.moveToNext()) {
                // 得到手机号码
                String phoneNumber = phoneCursor.getString(1);
                // 当手机号码为空的或者为空字段 跳过当前循环,即使这个联系人有名字也跳出循环
                if (TextUtils.isEmpty(phoneNumber)) {
                    continue;
                }
                // 如果有电话好么,那么就得到联系人名称
                String contactName = phoneCursor.getString(0);

                ContactBean cb = new ContactBean();
                cb.setContactName(contactName);
                cb.setPhoneNumber(phoneNumber);
                list.add(cb);
            }
            phoneCursor.close(); // 关闭指针
        }
        return list;
    }

    /**
     * 添加一个新的联系人数据
     *
     * @param name
     * @param phoneNumber
     * @return 是否添加成功
     */
    public void add(String name, String phoneNumber) {
        // 根据号码找数据,如果存在则不添加,因为有号码但无名字是不允许的
        // if (!findNameByPhoneNumber(phoneNumber)) {
        // 插入raw_contacts表,并获取_id属性
        Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");
        ContentResolver resolver = mContext.getContentResolver();
        ContentValues values = new ContentValues();
        long contact_id = ContentUris.parseId(resolver.insert(uri, values));
        // 插入data表
        uri = Uri.parse("content://com.android.contacts/data");
        // 添加姓名
        values.put("raw_contact_id", contact_id);
        values.put(Data.MIMETYPE, "vnd.android.cursor.item/name");
        values.put("data2", name);
        // values.put("data1", "Jack");
        resolver.insert(uri, values);
        values.clear();
        // 添加手机号码
        values.put("raw_contact_id", contact_id);
        values.put(Data.MIMETYPE, "vnd.android.cursor.item/phone_v2");
        values.put("data2", "2"); // 2表示手机
        values.put("data1", phoneNumber);
        resolver.insert(uri, values);
        values.clear();

    }

    /**
     * 删除单个联系人数据
     *
     * @param name
     * @return 是否删除成功
     */
    public boolean delete(String name) {
        try {
            // 根据姓名求id
            Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");
            ContentResolver resolver = mContext.getContentResolver();
            Cursor cursor = resolver.query(uri, new String[] { Data._ID }, "display_name = ?", new String[] { name }, null);
            if (cursor.moveToFirst()) {
                int id = cursor.getInt(0);
                // 根据id删除data中的相应数据
                resolver.delete(uri, "display_name = ?", new String[] { name });
                uri = Uri.parse("content://com.android.contacts/data");
                resolver.delete(uri, "raw_contact_id = ?", new String[] { id + "" });
                return true;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        Toast.makeText(mContext, "删除失败", Toast.LENGTH_SHORT).show();
        return false;
    }

    /*
     * // 删除全部联系人,十分耗时间。有错误 public boolean deleteAllContact() { ContentResolver
     * resolver = mContext .getContentResolver(); Cursor contactsCur =
     * resolver.query(ContactsContract.Contacts.CONTENT_URI, null, null, null,
     * null); while(contactsCur.moveToNext()){ //获取ID String rawId =
     * contactsCur.
     * getString(contactsCur.getColumnIndex(ContactsContract.Contacts._ID));
     * //删除 String where = ContactsContract.Data._ID + " =?"; String[]
     * whereparams = new String[]{rawId};
     * resolver.delete(ContactsContract.RawContacts.CONTENT_URI, where,
     * whereparams); } if(contactsCur.moveToNext() == false){ return true; }
     * return false; }
     */
    /*
     * //删除全部数据 public boolean deleteAll(){ getContentResolver().delete(
     * ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId), null,
     * null); try { ContentResolver resolver = mContext .getContentResolver();
     * Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");
     * resolver.delete(uri, "display_name= true", new String[]{"true"}); uri =
     * Uri.parse("content://com.android.contacts/data"); resolver.delete(uri,
     * "raw_contact_id= true", new String[]{"true"});
     *
     * } catch (Exception e) { Toast.makeText(mContext, "删除失败",
     * Toast.LENGTH_SHORT).show(); e.printStackTrace(); } return false; }
     */

    /**
     * @description 更新联系人数据
     *
     * @param name
     * @param phoneNumber
     * @return 是否更新成功
     */
    public boolean update(String name, String phoneNumber) {
        try {
            // 根据姓名求id,再根据id删除
            Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");
            ContentResolver resolver = mContext.getContentResolver();
            Cursor cursor = resolver.query(uri, new String[] { Data._ID }, "display_name = ?", new String[] { name }, null);
            if (cursor.moveToFirst()) {
                int id = cursor.getInt(0);
                Uri mUri = Uri.parse("content://com.android.contacts/data");// 对data表的所有数据操作
                ContentResolver mResolver = mContext.getContentResolver();
                ContentValues values = new ContentValues();
                values.put("data1", phoneNumber);
                mResolver.update(mUri, values, "mimetype=? and raw_contact_id=?",
                        new String[] { "vnd.android.cursor.item/phone_v2", id + "" });
                return true;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        Toast.makeText(mContext, "修改失败", Toast.LENGTH_SHORT).show();
        return false;
    }

    /**
     * @description 根据电话号码查询姓名
     *
     * @param phoneNumber
     * @return 查询是否成功
     */
    public boolean findNameByPhoneNumber(String phoneNumber) {
        // URI = content://com.android.contacts/data/phones/filter/#
        Uri uri = Uri.parse("content://com.android.contacts/data/phones/filter/" + phoneNumber);
        ContentResolver resolver = mContext.getContentResolver();
        // 从raw_contact表中返回display_name
        Cursor cursor = resolver.query(uri, new String[] { Data.DATA4 }, null, null, null);
        if (cursor.moveToFirst()) {
            Log.d("ContactsManager", "找到这个号码");
            return true;
        } else {
            Log.e("ContactsManager", "没找到这个号码");
            return false;
        }
    }

}
时间: 2024-10-10 01:55:23

对联系人进行增删改查的相关文章

编码实战Web端联系人的增删改查

首先画出分析图 实现效果如图 项目下的包如图: 实体包 package com.contactSystem.entiey; public class Contact { private String Id; private String name; private String sex; private String age; private String phone; private String qq; private String email; public String getId()

IOS9中联系人对象的使用及增删改查操作的函数封装

之前克服重重困难把IOS9中新的类联系人搞明白了,现在把增删改查封装成了函数,如下: 1 // 2 // ViewController.m 3 // IOS9中联系人CNContact的使用 4 // 5 // Created by mac on 16/5/6. 6 // Copyright © 2016年 mzw. All rights reserved. 7 // 8 9 #import "ViewController.h" 10 11 //导入IOS9联系人模型 12 @impo

【转载】ASP.NET MVC Web API 学习笔记---联系人增删改查

本章节简单介绍一下使用ASP.NET MVC Web API 做增删改查.目前很多Http服务还是通过REST或者类似RESP的模型来进行数据操作的.下面我们通过创建一个简单的Web API来管理联系人 说明:为了方便数据不使用真正的数据库,而是通过内存数据模拟 1.       Web API中包含的方法 Action HTTP method Relative URI GetAllContact GET /api/contact GetContact GET /api/contact /id

IOS开发中使用CNContact对通讯录增删改查

IOS开发中使用CNContact对通讯录增删改查 首先当然是把CNcontact包含在工程中: 1 @import Contacts; 1.下面是增加联系人的程序段: 1 CNMutableContact * contact = [[CNMutableContact alloc]init]; 2 contact.imageData = UIImagePNGRepresentation([UIImage imageNamed:@"22"]); 3 //设置名字 4 contact.gi

Android通讯录数据库介绍与基本操作(增删改查)

Android通讯录数据库介绍与基本操作(增删改查) 2014年2月21日 Android通讯录管理总结 这几天导师安排我一个任务就是研究一下Android通讯录获取联系人.通话记录.短信的方法,还有看看不同Android版本之间的异同是否能做到兼容之类的事情.Android通讯录这一块,我个人感觉是挺乱的,网上一堆关于查询本地数据库获取联系人的方法,但似乎都没有仔细说明数据有哪些重要的表,它们之间有什么联系.下面是本人查询资料总结的一下知识点,方便童鞋们以后用到. http://xys2891

ContentProvider 增删改查通讯录

一.通讯录应用介绍 通讯录应用是Android自带的应用程序,我们看到此应用的时候,可能只认为这是一个应用,用数据库存储数据,但是实际上不是这样的. 通讯录是ContentProvider的应用,通讯录由两部分组成: (1)com.android.providers.contacts的ContentProvider:真正存储数据的ContentProvider (2)com.android.contacts:运用ContentResolver获取数据的图形用户界面: 二.获取ContactPro

Python 模拟SQL对文件进行增删改查

1 #!/usr/bin/env python 2 # _*_ coding:UTF-8 _*_ 3 # __auth__: Dalhhin 4 # Python 3.5.2,Pycharm 2016.3.2 5 # 2017/05/15 6 7 import sys,os 8 9 def where(dbfile,where_list): #条件是一个list 10 11 def and_or_where(sub_where_list): 12 '''获取and或同时含有and.or关键字的条

【黑马Android】(04)数据库的创建和sql语句增删改查/LinearLayout展示列表数据/ListView的使用和BaseAdater/内容提供者创建

数据库的创建和sql语句增删改查 1. 加载驱动. 2. 连接数据库. 3. 操作数据库. 创建表: create table person( _id integer primary key, name varchar(20), age integer ); 添加: insert into person(name, age) values('lisi', 19); 删除: delete from person where _id = 1; 修改: update person set name =

ssm框架搭建+easyui增删改查实现

闲来无事,看了看别人的博客文档也跟着敲了敲,特地记录下来,方便以后学习: spring版本:4.0.6 mybatis版本:3.2.5 所有jar包打包下载:http://pan.baidu.com/s/1qLEaU 1.项目目录结构 其中,controller包下存放控制层文件,dao下存放各个model类相关的数据库操作接口,entity下放置各种model类,mappers下放置各个dao对应的映射文件,service服务层就不说了,放置各种service接口,impl是其具体实现类. 2