浅谈Android手机联系人开发之增删查改功能

最近在做手机联系人的功能模块的时候,遇到了很多的坑,在网上搜索的有一些所谓的最全的手机联系人开发的介绍还存在一些bug,所以我把我最近的项目心得和方法写下来,既能帮助大家减少了解android开发手机联系人的门槛,好,废话少说,接下来直奔主题。

一、深入浅出手机联系人的前奏(小米手机的data表跟模拟器的data表不一样)

1、手机联系人主要是对contacts2.db数据库表的操纵,这个数据库中有三个表是比较重要的,分别是data,raw_contacts,mimetyps这三个表。在下面的增删查改模块中,主要是根据表之间的关系来关联的处理的。

1.1、data表

1.2、mimetypes表

1.3、raw_contacts表

1.4、下载contacts2.db表的方法

在eclipse中打开android模拟器,在eclipse导航栏的window->show View->other..->File Explorer.单击eclipse导航栏右上角的DDMS,File Explorer 下的data->data->com.android.providers.contact->databases下就有contacts2.db数据库了。单击然后保存就可以了。

查看SqlLite软件的下载链接

2、深入浅出之手机联系人查询模块

 /**
 * 通过输入获取电话号码
 */
 public void number(String name1,long rawContactId) {
 //使用ContentResolver查找联系人数据
 Cursor cursor = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
 //遍历查询结果,找到所需号码
 while (cursor.moveToNext()) {
  //获取联系人ID
  String contactId = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));
  //获取联系人的名字
  String contactName = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
  if (name1.equals(contactName)) {
  //使用ContentResolver查找联系人的电话号码和用户名
  Cursor phone = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = " + contactId, null, null);
  if (phone.moveToNext()) {
  String phoneNumber1 = phone.getString(phone.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));//电话号码
  String phoneName1 = phone.getString(phone.getColumnIndex(Phone.DISPLAY_NAME));//姓名
  phoneNumber.setText(phoneNumber1);
  name.setText(phoneName1);
  }
  //获取邮箱信息
  Cursor emails =getContentResolver().query(ContactsContract.CommonDataKinds.Email.CONTENT_URI,null,ContactsContract.CommonDataKinds.Email.CONTACT_ID+"="+contactId,null,null);
   while(emails.moveToNext()){
   String emailAddress =emails.getString(emails.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));
   email.setText(emailAddress);
   }
   //获取IM信息
   Cursor cursorQQ =getContentResolver().query(ContactsContract.Data.CONTENT_URI,null,ContactsContract.Data.RAW_CONTACT_ID+"="+rawContactId + " AND " + "mimetype_id=2",null,null);
   while(cursorQQ.moveToNext()){
   //获取公司信息
   String im1 = cursorQQ.getString(cursorQQ.getColumnIndex(ContactsContract.CommonDataKinds.Im.DATA));
   qq.setText(im1);
  }
   //获取公司信息
   Cursor cursorCompany =getContentResolver().query(ContactsContract.Data.CONTENT_URI,null,ContactsContract.Data.RAW_CONTACT_ID+"="+rawContactId + " AND " + "mimetype_id = 4",null,null);
   while(cursorCompany.moveToNext()){
   String company1=cursorCompany.getString(cursorCompany.getColumnIndex("data1"));
   String position1=cursorCompany.getString(cursorCompany.getColumnIndex("data4"));
   position.setText(position1);
   company.setText(company1);
   }
  }
 }
}

3、深入浅出之手机联系人增加模块

 //增加联系人
 public void addContact(String name, String phoneNumber,String email,String company,String position,String im) {
 /* 往 raw_contacts 中添加数据,并获取添加的id号*/
 /* 往 raw_contacts 中添加数据,并获取添加的id号*/
 Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");
 ContentValues values = new ContentValues();
 long rawContactId= ContentUris.parseId(resolver.insert(uri, values));
 //插入data表
 uri = Uri.parse("content://com.android.contacts/data");
 // 向data表插入数据
 if (name != "") {
  values.put("raw_contact_id", rawContactId);
  values.put("mimetype", "vnd.android.cursor.item/name");
  values.put("data2", name);
  resolver.insert(uri, values);
 }
 // 向data表插入电话号码
 if ( phoneNumber != "") {
  values.clear();
  values.put("raw_contact_id", rawContactId);
  values.put("mimetype", "vnd.android.cursor.item/phone_v2");
  values.put("data2", "2");
  values.put("data1", phoneNumber);
  resolver.insert(uri, values);
 }
 //向data表中插入邮箱
 if (email!= "") {
  // 添加Email
  values.clear();
  values.put("raw_contact_id", rawContactId);
  values.put(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE);
  values.put(Email.DATA, email);
  values.put(Email.TYPE, Email.TYPE_WORK);
  resolver.insert(uri, values);
 }
 //向data表中插入联系人的组织
 if(company!=""&&position!=""){
  //organization
  values.clear();
  values.put(Data.RAW_CONTACT_ID, rawContactId);
  values.put(Organization.MIMETYPE, Organization.CONTENT_ITEM_TYPE);
  values.put(Organization.LABEL, name);
  values.put(Organization.TITLE, position);
  values.put(Organization.COMPANY, company);
  values.put(Organization.TYPE,Organization.TYPE_WORK);
  context.getContentResolver().insert(uri, values);
 }
 //向data表中插入联系人的QQ
 if(im!=""){
  //im
  values.clear();
  values.put("raw_contact_id", rawContactId);
  values.put("mimetype", "vnd.android.cursor.item/im");
  values.put(Im.DATA, im);
  values.put(Im.TYPE, Im.TYPE_WORK);
  resolver.insert(uri, values);
 }
 } 

4、深入浅出之手机联系人更新模块

// 更新联系人
 public void updataContact(long rawContactId,String name,String number,String email,String company,String position,String im) {
  Uri uri = Uri.parse("content://com.android.contacts/data");//对data表的所有数据操作
  ContentValues values = new ContentValues();
  //更新电话号码
  values.put("data1", number);
  resolver.update(uri, values, "mimetype_id=? and raw_contact_id=?", new String[]{"5", rawContactId+""}) ;
  //更新联系人姓名
  values.clear();
  values.put("data1", name);
  resolver.update(uri, values, "mimetype_id=? and raw_contact_id=?", new String[]{"7", rawContactId+""}) ;
  //更新email
  values.clear();
  values.put("data1", email);
  resolver.update(uri, values, "mimetype_id=? and raw_contact_id=?", new String[]{"1", rawContactId+""}) ;
  //更新im
  values.clear();
  values.put("data1", im);
  resolver.update(uri, values, "mimetype_id=? and raw_contact_id=?", new String[]{"2", rawContactId+""}) ;
  //更新company
  values.clear();
  values.put("data1", company);
  values.put("data3",name);
  values.put("data4",position);
  resolver.update(uri, values, "mimetype_id=? and raw_contact_id=?", new String[]{"4", rawContactId+""}) ;
 } 

5、深入浅出之手机联系人删除模块

// 删除联系人
 public void deleteContact(long rawContactId) {
 Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");
  Cursor cursor =
  resolver.query(uri,new String[]{RawContacts._ID},"contact_id=?",new String[]{String.valueOf(rawContactId) }, null );
  if(cursor.moveToFirst()){
  int id = cursor.getInt(0);
  resolver.delete(uri, "_id=?",new String[]{id+""});
  uri = Uri.parse("content://com.android.contacts/data");
  resolver.delete(uri, "raw_contact_id=?",new String[]{id+""});
  cursor.close();
  }
 } 

6、大话自制手机联系人软件与系统手机联系人软件的区别

6.1、系统的手机联系人软件在删除单个联系人的时候不是直接删除的,然是通过把某个值设置为0,使得该手机联系人信息不可见,根据网上的大多数实例都是直接把data数据库表中的单个联系人的信息直接delete了。

(0)

相关推荐

  • Android 属性动画ValueAnimator与插值器详解

    Android 属性动画ValueAnimator与插值器详解 一.ValueAnimator详解: ValueAnimator是整个动画的核心,ObjectAnimator即是继承自ValueAnimator来实现. ValueAnimator更像是一个数值发生器,用来产生具有一定规律的数字,从而让调动者来控制动画的实现过程. 1.ValueAnimator的使用: ValueAnimator valueAnimator = ValueAnimator.ofFloat(0, 100); val

  • Android中CountDownTimer 实现倒计时功能

    CountDownTimer CountDownTimer 是android 自带的一个倒计时类,使用这个类可以很简单的实现 倒计时功能 CountDownTimer 的实现方式 new CountDownTimer(6000,1000) {//第一个参数表示的是倒计时的总时间,第二参数表示的是倒计时的间隔时间. @Override public void onTick(long millisUntilFinished) {//倒计时的过程 textView.setText(millisUnti

  • Android中Edittext设置输入条件

    一.应用场景 之前做商城应用时,会有对用户资料的设置情况进行限制,如下: (1)用户邮箱,应当只允许输入英文字母,数字和@.两个符号, (2)用户手机,应当只能输入数字,禁止输入其他字符. (3)用户密码,应当不能输入空格以及中文字符等. 二.解决方案 针对用户邮箱以及用户手机,有以下两种解决方案: (1)EditText中的android:digits属性: 它表示EditText能够接受的字符集合.通过配置此属性,就可以实现只允许输入指定的字符.这里列举上述三种场景下的android:dig

  • Android自定义圆角ImageView控件

    目前一些比较火的图片加载库虽然支持圆角加载,若你是接的别人作了一半的项目,刚好别人用的图片加载库刚好不支持圆角加载,那么这颗控件你值得拥有.(支持网络图片的加载) 1.创建CustomImageView 类在你的项目中(源码如下) import android.content.Context; import android.content.res.TypedArray; import android.graphics.Bitmap; import android.graphics.Bitmap.

  • Android自定义实现图片加文字功能

    Android自定义实现图片加文字功能 分四步来写: 1,组合控件的xml; 2,自定义组合控件的属性; 3,自定义继承组合布局的class类,实现带两参数的构造器; 4,在xml中展示组合控件. 具体实现过程: 一.组合控件的xml 我接触的有两种方式,一种是普通的Activity的xml:一种是父节点为merge的xml.我项目中用的是第一种,但个人感觉第二种好,因为第一种多了相对或者绝对布局层. 我写的 custom_pictext.xml <?xml version="1.0&qu

  • 详解Android中的NestedScrolling机制带你玩转嵌套滑动

    一.概述 Android在support.v4包中为大家提供了两个非常神奇的类: NestedScrollingParent NestedScrollingChild 如果你从未听说过这两个类,没关系,听我慢慢介绍,你就明白这两个类可以用来干嘛了.相信大家都见识过或者使用过CoordinatorLayout,通过这个类可以非常便利的帮助我们完成一些炫丽的效果,例如下面这样的: 这样的效果就非常适合使用NestedScrolling机制去完成,并且CoordinatorLayout背后其实也是利用

  • Android AsyncTask详解及使用方法

     Android AsyncTask详解及使用方法  简介: AsyncTask就是一个封装过的后台任务类,顾名思义就是异步任务. AsyncTask,是android提供的轻量级的异步类,可以直接继承AsyncTask,在类中实现异步操作,并提供接口反馈当前异步执行的程度(可以通过接口实现UI进度更新),最后反馈执行的结果给UI主线程. 一.如果想自定义一个AsyncTask,可以写一个类,继承AsyncTask. eg: . //第一个参数为doInBackground中传入的类型,第二个为

  • 浅谈Android手机联系人开发之增删查改功能

    最近在做手机联系人的功能模块的时候,遇到了很多的坑,在网上搜索的有一些所谓的最全的手机联系人开发的介绍还存在一些bug,所以我把我最近的项目心得和方法写下来,既能帮助大家减少了解android开发手机联系人的门槛,好,废话少说,接下来直奔主题. 一.深入浅出手机联系人的前奏(小米手机的data表跟模拟器的data表不一样) 1.手机联系人主要是对contacts2.db数据库表的操纵,这个数据库中有三个表是比较重要的,分别是data,raw_contacts,mimetyps这三个表.在下面的增

  • 浅谈Android手机的抢红包插件

    前语 最近,Android手机上的手机管家更新了新版本,提供了红包闹钟功能,只要有微信红包或者QQ红包,就会自动提醒.恰逢最近又在做UI自动化的工作,使用到UI Automator框架.几行代码,就可以让手机自动完成某些操作,很有意思,今天就来扒一扒这背后的原理. UI Automator 传统的手工测试,我们需要点击一些控件元素,来查看输出的结果是否符合预期.比如在登录界面,输入正确的用户名和密码,点击登录按钮后,就可以正常登录. 如果这些操作,每一次都需要手工执行的话,是需要大量的人力成本的

  • ASP.NET实现电影票信息的增删查改功能

    题目 1.使用Code First技术创建一个Movie数据模型. public class Movie { public int ID { get; set; } //电影编号 public string Title { get; set; } //电影名称 public DateTime ReleaseDate { get; set; } //上映时间 public string Genre { get; set; } //电影类型 public decimal Price { get; s

  • Java操作Mongodb数据库实现数据的增删查改功能示例

    本文实例讲述了Java操作Mongodb数据库实现数据的增删查改功能.分享给大家供大家参考,具体如下: 首先,我们在windows下安装mongodb数据库,安装教程可查看前面一篇文章:http://www.jb51.net/article/85605.htm 代码如下: package io.mogo; import java.util.Map; import org.apache.commons.lang3.StringUtils; import com.mongodb.BasicDBObj

  • Java操作redis实现增删查改功能的方法示例

    本文实例讲述了Java操作redis实现增删查改功能的方法.分享给大家供大家参考,具体如下: 首先,我们需要在windows下配置一个redis环境,具体配置教程请看:http://www.jb51.net/article/96230.htm 然后需要导入:jedis-2.7.3.jar这个包,看如下代码: package redis.main; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; imp

  • PHP实现数据库的增删查改功能及完整代码

    本文用到:jquery.tp框架 TP_3.2.2/Application/Home/Controller/StuController.class.php <?php /** * Created by PhpStorm. * User: root * Date: 2018/4/17 * Time: 16:32 */ namespace Home\Controller; use Think\Controller; class StuController extends Controller { p

  • Python操作mysql数据库实现增删查改功能的方法

    本文实例讲述了Python操作mysql数据库实现增删查改功能的方法.分享给大家供大家参考,具体如下: #coding=utf-8 import MySQLdb class Mysql_Oper: def __init__(self,host,user,passwd,db): self.host=host self.user=user self.passwd=passwd self.database=db def db_connecet(self): try: #连接 conn=MySQLdb.

  • Java实现顺序表的增删查改功能

    创建顺序表 在java语言中要实现顺序表,首先创建一个类,因为顺序表本身就像数组,所以我们这里定义一个int类型的数组和usedata为有效数据,构造方法里先申请可以存放10个数据的空间. public class MyArraylist1 { public int[] elem;//存储数据的有效个数 public int usedata;//有效数据的个数 //构造方法 public MyArraylist1() { this.elem = new int[10]; } 主要实现以下方法 p

  • golang使用json格式实现增删查改的实现示例

    需求和思路 在一般的小项目或者一个小软件,例如客户端之类的小程序中,可能会需要数据的持久化.但是使用一般的数据库(Mysql)之类的不合适.使用sqlite3这种嵌入式的是个较好的方法,但是Go语言中sqlite3的库是C语言的,Cgo不支持跨平台编译.正是由于这种需求,才想到使用json格式将数据直接保存在文件中. 具体的思路是怎么样呢? 在Go语言中如果要将数据转化成json格式的话,有两种格式 struct 和 map. 如果同时需要增删查改功能的话,将map作为中间格式是比较合适的.接下

  • 浅谈Android View绘制三大流程探索及常见问题

    View绘制的三大流程,指的是measure(测量).layout(布局).draw(绘制) measure负责确定View的测量宽/高,也就是该View需要占用屏幕的大小,确定完View需要占用的屏幕大小后,就会通过layout确定View的最终宽/高和四个顶点在手机界面上的位置,等通过measure和layout过程确定了View的宽高和要显示的位置后,就会执行draw绘制View的内容到手机屏幕上. 在详细介绍这三大流程之前,需要简单了解一下ViewRootImpl,View绘制的三大步骤

随机推荐