浅谈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了。

时间: 2024-10-12 07:51:03

浅谈Android手机联系人开发之增删查改功能的相关文章

Java中单向链表的实现:增删查改功能

写一个大家都比较熟悉的数据结构:单向链表. 不过先告诉大家一个小秘密,java的API里面已经提供了单向链表的类,大家可以直接拿来用,不过学习数据结构课程的时候想必大家也已经知道,虽然系统会给我们提供一些常用的数据结构,但是自定义的总是能够带来不同的喜感的,而且通过自己的编写也更能够让我们了解其中实现的过程,而且我们还可以写一些比较个性化的方法作为属于自己的数据结构.这里主要是介绍一些常用结构里面都会用到的方法,以及链表具体是如何操作的. 首先,单链表相对于队列的优势在于存储地址不是连续的,这样

iis-用VS建立的webservice,连接sql对数据库进行增删查改,怎么样发布到IIS上

问题描述 用VS建立的webservice,连接sql对数据库进行增删查改,怎么样发布到IIS上 用vs调试已经实现和数据库的增删查改功能,但发布使用文件系统发布,显示不支持数据库,要怎么样发布才支持数据库,在IIS中进行增删查改呢? 解决方案 怎么显示的不支持数据库,检查你的web.config怎么配置的,连接字符串怎么写的,目标计算机上是否安装了sql server 解决方案二: 点击发布的时候目标文件夹选的是iis网页的文件夹,然后点击下一步,就出现此发布方法不支持数据库的发布 web.c

浅谈Android开发中项目的文件结构及规范化部署建议_java

一.几句话 使用Gradle及其推荐的项目框架 把密码等敏感数据放入gradle.properties 不要自己写Http客户端,使用Volley或OkHttp库 使用Jackson库来解析JSON数据 避免Guava并出于Dalvik 65K methods limit不要使用过多的库 使用Fragment来绘制UI界面 Activity主要用来管理Fragment 布局文件XML也是代码,好好组织它们 在布局文件里,使用styles以避免重复的属性 使用多个style文件而不是一个巨大的st

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

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

浅谈Android应用保护(零):出发点和背景

浅谈Android应用保护(零):出发点和背景             近几年来,无线平台特别是Android平台的安全逐渐成为各厂商关注的重点.各种新的思路和玩法层出不穷.所以,笔者基于前一段时间的学习和整理,写了这系列关于Android应用安全和保护的文章. 这5篇文章主要关注客户端代码和数据的保护,介绍了几种针对Android应用的逆向分析.攻击和防护的方法.内容比较浅显,适合没有Android安全研究背景的同学入门和科普阅读. 无线端应用对抗的出发点和背景 根本上来说,手机客户端是完全控

浅谈Android Studio 3.0 工具新特性的使用 Android Profiler 、Device File Explorer

前言: 其实 studio3.0的工具大家也已经使用过一段时间了,自己呢,就是从bate版开始使用的,我觉得比较好用的几个地方.就几个,可能还没用到其他的精髓. 但我觉的这个两个功能对我是比较实用的.好那么下面就给大家介绍一下吧. 正文: 话不多说咱们直接上图吧.(个人比较喜欢看图说话) 第一个(Android Profiler)我要介绍的就是这个了.(先看一下效果"震撼一下") (图-1) (图-2) (图-3) (厉害不厉害,牛逼不牛逼)那么我们怎么来操作这个工具呢,来咱们接着看图

浅谈android获取设备唯一标识完美解决方案

本文介绍了浅谈android获取设备唯一标识完美解决方案,分享给大家,具体如下: /** * deviceID的组成为:渠道标志+识别符来源标志+hash后的终端识别符 * * 渠道标志为: * 1,andriod(a) * * 识别符来源标志: * 1, wifi mac地址(wifi): * 2, IMEI(imei): * 3, 序列号(sn): * 4, id:随机码.若前面的都取不到时,则随机生成一个随机码,需要缓存. * * @param context * @return */ p

Android手机联系人快速索引(手机通讯录)_Android

最近需要实现一个手机通讯录的快速索引功能.根据姓名首字母快速索引功能.下面是一个手机联系人快速索引的效果,总体来说代码不算难,拼音转换的地方略有复杂.下面上源码:源码中有注释. 下面是效果图: MainActivity: import java.util.ArrayList; import java.util.Collections; import java.util.List; import android.app.Activity; import android.os.Bundle; imp

[原创]浅谈如何使用gcc开发NT核心驱动程序

 [原创]浅谈如何使用gcc开发NT核心驱动程序       一谈到在 Win NT 下开发核心驱动程序,可能不少人首先都会想到微软"正统" 的VC来.诚然,用VC 配合 WINDDK 的确工作的不错,但或许我们可以让其变 得更简单更完善一些.     其实偶一般是用 Masm32v9 + EditPlus2 编写 NT内核驱动,仅此而已. 从环境搭建的便捷性和编写代码的灵活性来说无疑这是非常高的.但汇编 终归是汇编,虽然强大,但很多事都要自己动手来做,往往很简单的功能都 要用比较&q