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

所属分类: 软件编程 / Android 阅读数: 36
收藏 0 赞 0 分享

最近在做手机联系人的功能模块的时候,遇到了很多的坑,在网上搜索的有一些所谓的最全的手机联系人开发的介绍还存在一些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了。

更多精彩内容其他人还在看

Android控件系列之CheckBox使用介绍

CheckBox和Button一样,也是一种古老的控件,它的优点在于,不用用户去填写具体的信息,只需轻轻点击,缺点在于只有“是”和“否”两种情况,但我们往往利用它的这个特性,来获取用户的一些信息
收藏 0 赞 0 分享

Android控件系列之EditText使用方法

EditText是接受用户输入信息的最重要控件。通过前面课程的学习,您可能会猜到可以利用EditText.getText()获取它的文本,但真正的项目中,可能没那么简单,需要更多的限制,如文本长度限制,是否数字限制等等
收藏 0 赞 0 分享

Android控件系列之TextView使用介绍

TextView类似一般UI中的Label,TextBlock等控件,只是为了单纯的显示一行或多行文本,本文介绍了Android中文本控件TextView的用法和常用属性的用法
收藏 0 赞 0 分享

asynctask的用法详解

Android UI操作并不是线程安全的并且这些操作必须在UI线程中执行,本文将为您介绍asynctask的用法
收藏 0 赞 0 分享

Android开发 旋转屏幕导致Activity重建解决方法

Android开发文档上专门有一小节解释这个问题。简单来说,Activity是负责与用户交互的最主要机制,接下来为您详细介绍
收藏 0 赞 0 分享

Notification与NotificationManager详细介绍

在Android系统中,发一个状态栏通知还是很方便的。下面我们就来看一下,怎么发送状态栏通知,状态栏通知又有哪些参数可以设置
收藏 0 赞 0 分享

android LinearLayout和RelativeLayout组合实现精确布局方法介绍

用android LinearLayout和RelativeLayout实现精确布局此方法适合很适合新人看
收藏 0 赞 0 分享

android listview优化几种写法详细介绍

这篇文章只是总结下getView里面优化视图的几种写法,需要的朋友可以参考下
收藏 0 赞 0 分享

Android应用开发SharedPreferences存储数据的使用方法

SharedPreferences是Android中最容易理解的数据存储技术,实际上SharedPreferences处理的就是一个key-value(键值对)SharedPreferences常用来存储一些轻量级的数据
收藏 0 赞 0 分享

Android之PreferenceActivity应用详解

为了引入这个概率 首先从需求说起 即:现有某Activity专门用于手机属性设置 那么应该如何做呢
收藏 0 赞 0 分享
查看更多