对于手机通讯录的增删改查操作。

废话就不多说了,主要用到了ContentProvider的相关知识。

//这是一个工具类,主要是将联系人的Name,phone ,email,address,放到List集合中。

package com.example.contact_content_provider;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import android.content.ContentResolver;
import android.database.Cursor;
import android.net.Uri;
import android.provider.ContactsContract;

public class ContactUtils
{
    public static List<Map<String, Object>> getContactList(ContentResolver resolver)
    {
        List<Map<String, Object>>list=new ArrayList<Map<String,Object>>();
        //对应表  raw_contacts
         String contactUriStr="content://com.android.contacts/raw_contacts";//帮助理解
         Uri contactUri=ContactsContract.Contacts.CONTENT_URI;
         //对应data表
         String dataUriStr="content://com.android.contacts/data";
        //联系人电话
         String phoneUriStr="content://com.android.contacts/data/phones";
          Uri  phoneUri=ContactsContract.CommonDataKinds.Phone.CONTENT_URI;
          //联系人email;
          String emailUriStr="content://com.android.contacts/data/emails";
          Uri emailUri=ContactsContract.CommonDataKinds.Email.CONTENT_URI;
          //联系人的地址:
          String addressUriStr="content://com.android.contacts/data/postals";
          Uri  addressUri=ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_URI;
          Cursor contactCursor=resolver.query(contactUri, new String []{"_id","display_name"}, null, null, null);
          while (contactCursor.moveToNext())
            {
                int contactId=contactCursor.getInt(0);
                String display_name=contactCursor.getString(1);
                Map<String , Object>map=new HashMap<String, Object>();
                map.put(ContactsContract.Contacts.DISPLAY_NAME,display_name);
                map.put(ContactsContract.Contacts._ID, contactId);
                //查询联系人电话
                Cursor phoneCursor=resolver.query(phoneUri, null, "raw_contact_id=?", new String []{contactId+""}, null);
                String phone="";
                while(phoneCursor.moveToNext())
                    {
                        phone=phoneCursor.getString(phoneCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DATA));
                    }
                map.put("phone", phone);
                //查询联系人的邮箱
                Cursor emailcCursor=resolver.query(emailUri, null, "raw_contact_id=?", new String []{contactId+""}, null);
                String email="";
                while(emailcCursor.moveToNext())
                    {
                        email=emailcCursor.getString(emailcCursor.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));

                    }
                map.put("email", email);
                Cursor addCursor=resolver.query(addressUri, null, "raw_contact_id=?", new String [] {contactId+""}, null);
                String address="";
                while(addCursor.moveToNext())
                    {
                        address=addCursor.getString(addCursor.getColumnIndex("data1"));
                    }//上面的ContactsContract.CommonDataKinds.Email.DATA/phone  都可以用data1代替
                map.put("address", address);
                list.add(map);
            }
        return list;
    }
}

------------------------------------------------------------------------------------------------

自定义适配器,继承了BaseAdapter。重写里面的四个方法。从而达到自己想要的布局。

这个东西很简单,就不做过多的解释了。

package com.example.contact_content_provider;

import java.util.List;
import java.util.Map;

import android.content.Context;
import android.provider.ContactsContract.Contacts;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

public class MyAdapter  extends BaseAdapter
{
  ViewHolder holder;
  private List<Map<String, Object>>list;
  LayoutInflater inflater;
  public MyAdapter(Context context,List<Map<String, Object>>list)
  {
      inflater=LayoutInflater.from(context);
      this.list=list;

  }
    @Override
    public int getCount()
    {
        // TODO Auto-generated method stub
        return list.size();
    }

    @Override
    public Object getItem(int arg0)
    {
        // TODO Auto-generated method stub
        return list.get(arg0);
    }

    @Override
    public long getItemId(int arg0)
    {
        // TODO Auto-generated method stub
        return arg0;
    }

    @Override
    public View getView(int arg0, View arg1, ViewGroup arg2)
    {

        if (arg1==null)
            {
                holder=new ViewHolder();
                arg1=inflater.inflate(R.layout.item, null);
                holder.tvname=(TextView)arg1.findViewById(R.id.tv_name);
                holder.tvphone=(TextView)arg1.findViewById(R.id.tv_phone);
                holder.tvemail=(TextView)arg1.findViewById(R.id.tv_email);
                holder.tvaddress=(TextView)arg1.findViewById(R.id.tv_address);
                arg1.setTag(holder);
            }else {
                holder=(ViewHolder)arg1.getTag();
            }
         holder.tvname.setText(list.get(arg0).get("display_name").toString());
         holder.tvphone.setText(list.get(arg0).get("phone").toString());
         holder.tvemail.setText(list.get(arg0).get("email").toString());
         holder.tvaddress.setText(list.get(arg0).get("address").toString());
        return arg1;
    }
     class ViewHolder
     {
         TextView tvname,tvphone,tvemail,tvaddress;
     }
}

------------------------------------------------------------------------------------------------

这是主函数 ,里面的各项操作我已经做了详细的注释。

-------------------------------------------------------------------------------------------------------

package com.example.contact_content_provider;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import android.R.integer;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.net.Uri;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.view.ContextMenu;
import android.view.MenuItem;
import android.view.View;
import android.view.ContextMenu.ContextMenuInfo;
import android.widget.AdapterView.AdapterContextMenuInfo;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Toast;

public class MainActivity extends Activity
{
   private MyAdapter adapter;
   private ListView listView;
   private List<Map<String, Object>>dataList;
   ContentResolver resolver; //数据解析器
   boolean flag=true;//设置标志位 判断是进行添加还是修改操作
   private AlertDialog edDialog,delDialog;  //初始化对话框
   private EditText ed_name,ed_phone,ed_email,ed_address;  //初始化对话框里的编辑项
   int  position;  //取到长按时ListView所在的位置
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initData();

        inInDialog();

    }
      //初始化视图
     public void initData()
     {
         listView=(ListView)findViewById(R.id.lv_showContacts);
         resolver=getContentResolver();
         dataList=new ArrayList<Map<String,Object>>();
        // dataList=ContactUtils.getContactList(resolver);
         adapter=new MyAdapter(this, dataList);
         listView.setAdapter(adapter);
         registerForContextMenu(listView);
     }
     //为搜索按钮设置监听事件
     public void queryContacts(View v)
     {
         List<Map<String, Object>>list=ContactUtils.getContactList(resolver);
         dataList.clear();//不进行此操作的时候会使联系人重复出现
         dataList.addAll(list);
         adapter.notifyDataSetChanged();//数据有变动时,执行唤醒操作,告诉数据库,我变了
     }
     public void addContacts(View v)
     {
         flag=true;
         ed_address.setText("");
         ed_email.setText("");
         ed_name.setText("");
         ed_phone.setText("");
         edDialog.show();
     }
     //初始化对话框
      public void inInDialog()
      {
          View view=getLayoutInflater().inflate(R.layout.dialog_edit, null);
          ed_name=(EditText)view.findViewById(R.id.et_name);
          ed_phone=(EditText)view.findViewById(R.id.et_phone);
          ed_email=(EditText)view.findViewById(R.id.et_email);
          ed_address=(EditText)view.findViewById(R.id.et_address);
          edDialog=new AlertDialog.Builder(this).setView(view).setIcon(android.R.drawable.ic_input_add).setTitle("请选择你要编辑的选项").
                  setPositiveButton("确认", new OnClickListener()
                {

                    @Override
                    public void onClick(DialogInterface arg0, int arg1)
                    {
                        if (flag)
                            {
                                insertData();  //执行插入操作
                            }else {
                                updateData();  //执行编辑或者修改操作
                            }

                    }
                }).setNegativeButton("取消", new OnClickListener()
                {

                    @Override
                    public void onClick(DialogInterface arg0, int arg1)
                    {
                        // TODO Auto-generated method stub

                    }
                }).create();
          //初始化删除对话框
          delDialog=new AlertDialog.Builder(this).setIcon(android.R.drawable.ic_input_add).setTitle("你确定要删除吗").
                  setPositiveButton("确认", new OnClickListener()
                  {

                      @Override
                      public void onClick(DialogInterface arg0, int arg1)
                      {

                            int n= resolver.delete(ContactsContract.RawContacts.CONTENT_URI, "_id=?", new String[]{dataList.get(position).get("_id").toString()});
                            if (n>0)
                                {
                                    Toast.makeText(getApplicationContext(), "删除成功", 1).show();
                                    queryContacts(null);
                                }

                      }
                  }).setNegativeButton("取消", new OnClickListener()
                  {

                      @Override
                      public void onClick(DialogInterface arg0, int arg1)
                      {

                      }
                  }).create();

      }
      //为ListView的长按操作设置菜单选项
        public void onCreateContextMenu(ContextMenu menu, View v,
                ContextMenuInfo menuInfo)
        {
            // TODO Auto-generated method stub
            super.onCreateContextMenu(menu, v, menuInfo);
            getMenuInflater().inflate(R.menu.main,menu);//得到菜单视图
            position=((AdapterContextMenuInfo)menuInfo).position;  //获得选中的ListVIew的Id
        }

        public boolean onContextItemSelected(MenuItem item)
        {
            switch (item.getItemId())
                {
                case R.id.update://执行修改操作
                    flag=false;  //改变标志位
                    Map<String, Object>map=dataList.get(position);
                    //得到选中的ListVIew的值 并且显示到编辑框
                    ed_address.setText(map.get("address").toString());
                    ed_email.setText(map.get("email").toString());
                    ed_name.setText(map.get("display_name").toString());
                    ed_phone.setText(map.get("phone").toString());
                    edDialog.show();
                    break;
                case R.id.delete:
                    delDialog.show();
                    break;
                default:
                    break;
                }
            return super.onContextItemSelected(item);
        }
        //插入操作
      public void insertData()
      {
          String name=ed_name.getText().toString();
          String phone=ed_phone.getText().toString();
          String email=ed_email.getText().toString();
          String address=ed_address.getText().toString();
          ContentValues values=new ContentValues();
          values.put("display_name", name);
          values.put("display_name_alt", name);
          //向 raw_contacts表中插入数据。获得新增行的_id;
          Uri uri=resolver.insert(Uri.parse("content://com.android.contacts/raw_contacts"), values);
           //获得_id
          long id=ContentUris.parseId(uri);
          //向表中插入数据display_name
          // values.clear();
           values.put("data1", name);
           values.put("data2", name);
           values.put("raw_contact_id", id);
           values.put("mimetype", "vnd.android.cursor.item/name");
           resolver.insert(ContactsContract.Data.CONTENT_URI, values);
           //插入phone
          // values.clear();
           values.put("data1", phone);
           values.put("raw_contact_id", id);
           values.put("mimetype", "vnd.android.cursor.item/phone_v2");
           resolver.insert(ContactsContract.Data.CONTENT_URI, values);
           //插入email
           values.clear();
           values.put("data1",email);
           values.put("raw_contact_id", id);
           values.put("mimetype", "vnd.android.cursor.item/email_v2");
           resolver.insert(ContactsContract.Data.CONTENT_URI, values);
           //插入Address
            values.clear();
            values.put("data1", address);
            values.put("raw_contact_id", id);
            values.put("mimetype", "vnd.android.cursor.item/postal-address_v2");
            resolver.insert(ContactsContract.Data.CONTENT_URI, values);
            queryContacts(null);
      }
      public void updateData()
      {
          //获得对话框填写的内容
          String name=ed_name.getText().toString();
          String phone=ed_phone.getText().toString();
          String email=ed_email.getText().toString();
          String address=ed_address.getText().toString();
          //获得ListVIew Position位置上所对应的在data中的_id
          String _id=dataList.get(position).get("_id").toString();
          //根据_id修改raw_contacts
        ContentValues values=new ContentValues();
        values.put("display_name", name);
        values.put("display_name_alt", name);//x修改两次的原因是name在两个表中都存在
        resolver.update(Uri.parse("content://com.android.contacts/raw_contacts"), values, "_id=?", new String []{_id});
        //根据_id修改联系人姓名
        values.clear();
        values.put("data1", name);
        values.put("data2", name);
        int  n1=resolver.update(Uri.parse("content://com.android.contacts/data"), values, "raw_contact_id=? and mimetype_id=?", new String[]{_id,7+""});
       //根据_id修改联系人的phone
        values.clear();
        values.put("data1", phone);
        int n2=resolver.update( ContactsContract.Data.CONTENT_URI,values, "raw_contact_id=? and mimetype_id=?", new String []{_id,5+""});
      //根据id修改联系人的email
        values.clear();
        values.put("data1", email);
        int n3=resolver.update(ContactsContract.Data.CONTENT_URI, values, "raw_contact_id=? and mimetype_id=?", new String []{_id,1+""});
        //根据_id修改联系人的address;
        values.clear();
        values.put("data1", address);
        int n4=resolver.update(ContactsContract.Data.CONTENT_URI, values, "raw_contact_id=? and mimetype_id=?", new String []{_id,8+""});
        if (n1>0|n2>0|n3>0|n4>0)
            {
                Toast.makeText(this, "修改成功", 1).show();
                queryContacts(null);
            }
        else {
            Toast.makeText(this, "修改失败", 1).show();
        }

      }
}··········································································································接下来的是布局文件 ,写的比较简单,也不美观。这种细致的工作有空自己慢慢玩。这个布局是用来查询和新增联系人。
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <Button
        android:id="@+id/btn_query"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="queryContacts"
        android:text="查询联系人" />
    <Button
        android:id="@+id/btn_add"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@id/btn_query"
        android:onClick="addContacts"
        android:text="新增联系人"
        />
    <ListView
        android:id="@+id/lv_showContacts"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@id/btn_query"></ListView>

</RelativeLayout>

-------------------------------------------------------------------------------------------------------联系人的修改和新增界面


 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <Button
        android:id="@+id/btn_query"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="queryContacts"
        android:text="查询联系人" />
    <Button
        android:id="@+id/btn_add"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@id/btn_query"
        android:onClick="addContacts"
        android:text="新增联系人"
        />
    <ListView
        android:id="@+id/lv_showContacts"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@id/btn_query"></ListView>

</RelativeLayout>

---------------------------------------------------------------------------------------------------------------------

这是联系人的查询显示界面。。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <TextView
        android:id="@+id/tv_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="name"/>
    <TextView
        android:id="@+id/tv_phone"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:text="phone"/>
    <TextView
        android:id="@+id/tv_address"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/tv_name"
        android:text="address"/>
    <TextView
        android:id="@+id/tv_email"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/tv_name"
        android:layout_alignParentRight="true"
        android:text="email"/>
</RelativeLayout>

。还有一点,要对手机里的联系人进行操作,必须要在清单文件中加入两个权限。

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

时间: 2024-10-10 07:43:35

对于手机通讯录的增删改查操作。的相关文章

(转)SQLite数据库增删改查操作

原文:http://www.cnblogs.com/linjiqin/archive/2011/05/26/2059182.html SQLite数据库增删改查操作 一.使用嵌入式关系型SQLite数据库存储数据 在Android平台上,集成了一个嵌入式关系型数据库--SQLite,SQLite3支持NULL.INTEGER.REAL(浮点数字).TEXT(字符串文本)和BLOB(二进制对象)数据类型,虽然它支持的类型只有五种,但实际上sqlite3也接受varchar(n).char(n).d

Scala对MongoDB的增删改查操作

=========================================== 原文链接: Scala对MongoDB的增删改查操作 转载请注明出处! =========================================== 依赖环境:jdk1.8.Scala 2.12.idea mongodb Driver:3.1.1.注意,mongo for scala的驱动涉及多个jar(如下图),依赖于mongo-java-driver.jar 这里使用的sbt管理依赖,直接在bu

Java+MyEclipse+Tomcat (六)详解Servlet和DAO数据库增删改查操作

此篇文章主要讲述DAO.Java Bean和Servlet实现操作数据库,把链接数据库.数据库操作.前端界面显示分模块化实现.其中包括数据的CRUD增删改查操作,并通过一个常用的JSP网站前端模板界面进行描述.参考前文: Java+MyEclipse+Tomcat (一)配置过程及jsp网站开发入门 Java+MyEclipse+Tomcat (二)配置Servlet及简单实现表单提交 Java+MyEclipse+Tomcat (三)配置MySQL及查询数据显示在JSP网页中 Java+MyE

作业员工信息表实现增删改查操作

有以下员工信息表 当然此表你在文件存储时可以这样表示 1 1,Alex Li,22,13651054608,IT,2013-04-01 现需要对这个员工信息文件,实现增删改查操作 可进行模糊查询,语法至少支持下面3种: select name,age from staff_table where age > 22 select  * from staff_table where dept = "IT" select  * from staff_table where enroll

【greenDAO3】 项目搭建与增删改查操作

最近需要开始一个新的项目了,考虑到既然是新项目了,那么一些常用的框架肯定也要用当下最火的!这次的新项目中涉及到了本地数据存储,很早前有个项目的本地数据库框架用的是ActiveAndroid,github找了下这个框架,发现已经两年多已经没有更新了.然后就想到了一直没有时间去涉及到的greenDAO,github一搜索,哦呦?star有5000+,并且依然保持着很高的更新频率,并且性能远远的高于activeAndroid(见下图),果断选用. 刚开始想偷偷懒,大致浏览了下greenDAO官网后就开

基于Java的XML文件模拟数据库进行增删改查操作

我们知道XML文件既可以用来进行数据的传输,也可以配合DTD约束文件用来作为配置文件,当然其本质就是一个加了标签以及众多空格保持格式的字符串,那么就可以用Java进行操作. 本例是使用MyEclipse带入DOM4j解析时要用的jar包的基础上做的:当然DOM4j相对于DOM SAX 等解析方式的方便程度是不言而喻的. 下面是本次用例XML文件 <?xml version="1.0" encoding="UTF-8"?> <persons> 

MyBatis基本增删改查操作

本文内容主要介绍单条记录的增删改查操作,MyBatis提供了很多完成单条记录的增删改查操作的API.本例主要讲述<UserMapper> UserMapper org.apache.ibatis.session.SqlSession.getMapper(Class<UserMapper> clazz)的使用.使用此API,我们需要创建UserMapper操作接口,函数名和MyBatis的User.xml配置文件中的操作id名对应. [转载使用,请注明出处:http://blog.c

基于视图的增删改查操作(颠覆传统思维吧)

视图是关系型数据库提供的一个非常强大好用的功能,它提供了一种基于基本表(相对视图的虚拟表而言)的数据提取重组和分隔技术. 视图通过对一个或者多个基本表进行数据提取和重新组织,将数据以用户希望的方式重新呈现. 需要注意的是,视图的主要目的就是重新组织多个基础表的数据以新的方式展现,重点是数据展示,并不涉及到增删改的功能.(另一个主要功能是数据隔离) 对于现有市场上不同的数据库来说,对于视图的增删改都不支持,或者说支持的很不好,有很多约束条件. 有人说过,产品功能是有限的,用户需求是无限的,真理.我

DataSet之增删改查操作(DataGridView绑定)

DataSet数据集,数据缓存在客户端内存中,支持断开式连接.DataGridView控件绑定DataSet时,它自动的改变的DS的行的状态,而且在做增删改查的时候,可以借助SqlCommandBuilder类来完成. SqlCommandBuilder必须执行SELECT命令来检索元数据,所以它要求多往返服务器一次,从而增加了应用程序的开销,而且操作的表必须要有主键约束.优点是自动建立insertcommand等命令 1,添加操作 private void button2_Click(obje