一、通讯录应用介绍
通讯录应用是Android自带的应用程序,我们看到此应用的时候,可能只认为这是一个应用,用数据库存储数据,但是实际上不是这样的。
通讯录是ContentProvider的应用,通讯录由两部分组成:
(1)com.android.providers.contacts的ContentProvider:真正存储数据的ContentProvider
(2)com.android.contacts:运用ContentResolver获取数据的图形用户界面;
二、获取ContactProvider的源代码
Android源代码: http://my.oschina.net/zhanglubing/blog/40623用git获取;
如果要获取ContactProvider,则安装git,并打开git bash,输入
git clone https://android.googlesource.com/platform/packages/providers/ContactsProvider.git即可;
目录结构如下:
为何要获取ContactProvider的源代码呢?
因为如果要访问ContentProvider,必须要了解URI的设置(authority,path等);只有查看源代码才能够知道;
AndroidManifest.xml为清单文件,列出了ContactProvider的authorities,以及要访问通讯录需要的权限;
-
<uses-permissionandroid:name="android.permission.READ_CONTACTS"/>
-
<uses-permissionandroid:name="android.permission.WRITE_CONTACTS"/>
主要的通讯录程序为ContactsProvider2.java,authorities为:contacts或com.android.contacts;
三、通讯录数据库结构介绍
表结构如下:
通讯录是存放在/data/data/com.android.providers.contacts/databases/contacts2.db,里面主要的表有:
(1)raw_contacts:存放联系人的ID,
_id属性为主键,声明为autoincrement,即不需要手动设置,其他属性也不需要手动设置就有默认值;
display_name属性为姓名;
(2)mimetypes:存放数据的类型,比如"vnd.android.cursor.item/name"表示“姓名”类型的数据,"vnd.android.cursor.item/phone_v2"表示“电话”类型的数据;
(3)data:存放具体的数据;
raw_contact_id属性用来连接raw_contacts表,每条记录表示一个具体数据;我们主要的数据(email、phone等)都存放在data表;
data1属性存放总数据;
data2属性:
-如果此记录存放姓名,则data2存放名;
-如果此记录存放电话,则data2存放类型,比如手机、家电;
-如果此记录存放组织,则data2存放类型,比如公司、其他;
-如果此记录存放地址,则data2存放类型,比如住宅,单位等;
四、对通信录做增删改查
简单的说:对通讯录操作就是对一个普通的ContentProvider操作;
1.Query
(1)根据电话号码查询姓名
-
-
publicvoidtestReadNameByPhone(){
-
Stringphone="12345678";
-
-
Uriuri=Uri.parse("content://com.android.contacts/data/phones/filter/"+phone);
-
ContentResolverresolver=this.getContext().getContentResolver();
-
Cursorcursor=resolver.query(uri,newString[]{Data.DISPLAY_NAME},null,null,null);
-
if(cursor.moveToFirst()){
-
Log.i("Contacts","name="+cursor.getString(0));
-
}
-
}
(2)查询所有的联系人
-
-
-
publicvoidtestReadAll(){
-
-
Uriuri=Uri.parse("content://com.android.contacts/contacts");//访问raw_contacts表
-
ContentResolverresolver=this.getContext().getContentResolver();
-
Cursorcursor=resolver.query(uri,newString[]{Data._ID},null,null,null);
-
while(cursor.moveToNext()){
-
StringBuilderbuf=newStringBuilder();
-
intid=cursor.getInt(0);
-
buf.append("id="+id);
-
uri=Uri.parse("content://com.android.contacts/contacts/"+id+"/data");//如果要获得data表中某个id对应的数据,则URI为content://com.android.contacts/contacts/#/data
-
Cursorcursor2=resolver.query(uri,newString[]{Data.DATA1,Data.MIMETYPE},null,null,null);
-
while(cursor2.moveToNext()){
-
Stringdata=cursor2.getString(cursor2.getColumnIndex("data1"));
-
if(cursor2.getString(cursor2.getColumnIndex("mimetype")).equals("vnd.android.cursor.item/name")){
-
buf.append(",name="+data);
-
}
-
elseif(cursor2.getString(cursor2.getColumnIndex("mimetype")).equals("vnd.android.cursor.item/phone_v2")){
-
buf.append(",phone="+data);
-
}
-
elseif(cursor2.getString(cursor2.getColumnIndex("mimetype")).equals("vnd.android.cursor.item/email_v2")){
-
buf.append(",email="+data);
-
}
-
elseif(cursor2.getString(cursor2.getColumnIndex("mimetype")).equals("vnd.android.cursor.item/postal-address_v2")){
-
buf.append(",address="+data);
-
}
-
elseif(cursor2.getString(cursor2.getColumnIndex("mimetype")).equals("vnd.android.cursor.item/organization")){
-
buf.append(",organization="+data);
-
}
-
}
-
Stringstr=buf.toString();
-
Log.i("Contacts",str);
-
}
-
}
2.Insert
(1)一步一步添加数据
-
-
publicvoidtestAddContacts(){
-
-
Uriuri=Uri.parse("content://com.android.contacts/raw_contacts");
-
ContentResolverresolver=this.getContext().getContentResolver();
-
ContentValuesvalues=newContentValues();
-
longcontact_id=ContentUris.parseId(resolver.insert(uri,values));
-
-
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","zdong");
-
values.put("data1","xzdong");
-
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");
-
values.put("data1","87654321");
-
resolver.insert(uri,values);
-
values.clear();
-
-
values.put("raw_contact_id",contact_id);
-
values.put(Data.MIMETYPE,"vnd.android.cursor.item/email_v2");
-
values.put("data2","2");
-
values.put("data1","xzdong@xzdong.com");
-
resolver.insert(uri,values);
-
}
(2)批量添加数据
核心代码:
(1)ContentProviderOperation operation = ContentProviderOperation.newInsert(uri).withValue("key","value").build();
(2)resolver.applyBatch("authorities",operations);//批量提交
-
<spanstyle="font-size:18px;">publicvoidtestAddContactsInTransaction()throwsException{
-
Uriuri=Uri.parse("content://com.android.contacts/raw_contacts");
-
ContentResolverresolver=this.getContext().getContentResolver();
-
ArrayList<ContentProviderOperation>operations=newArrayList<ContentProviderOperation>();
-
-
-
ContentProviderOperationoperation1=ContentProviderOperation
-
.newInsert(uri).withValue("account_name",null).build();
-
operations.add(operation1);
-
-
uri=Uri.parse("content://com.android.contacts/data");
-
-
ContentProviderOperationoperation2=ContentProviderOperation
-
.newInsert(uri).withValueBackReference("raw_contact_id",0)
-
-
.withValue("mimetype","vnd.android.cursor.item/name")
-
.withValue("data2","xzdong").build();
-
operations.add(operation2);
-
-
ContentProviderOperationoperation3=ContentProviderOperation
-
.newInsert(uri).withValueBackReference("raw_contact_id",0)
-
.withValue("mimetype","vnd.android.cursor.item/phone_v2")
-
.withValue("data2","2").withValue("data1","0000000").build();
-
operations.add(operation3);
-
resolver.applyBatch("com.android.contacts",operations);
-
}</span>
3.Delete
核心思想:
(1)先在raw_contacts表根据姓名查出id;
(2)在data表中只要raw_contact_id匹配的都删除;
-
publicvoidtestDelete()throwsException{
-
Stringname="xzdong";
-
-
Uriuri=Uri.parse("content://com.android.contacts/raw_contacts");
-
ContentResolverresolver=this.getContext().getContentResolver();
-
Cursorcursor=resolver.query(uri,newString[]{Data._ID},"display_name=?",newString[]{name},null);
-
if(cursor.moveToFirst()){
-
intid=cursor.getInt(0);
-
-
resolver.delete(uri,"display_name=?",newString[]{name});
-
uri=Uri.parse("content://com.android.contacts/data");
-
resolver.delete(uri,"raw_contact_id=?",newString[]{id+""});
-
}
-
}
4.Update
核心思想:
(1)不需要更新raw_contacts,只需要更新data表;
(2)uri=content://com.android.contacts/data 表示对data表进行操作;
-
publicvoidtestUpdate()throwsException{
-
intid=1;
-
Stringphone="999999";
-
Uriuri=Uri.parse("content://com.android.contacts/data");//对data表的所有数据操作
-
ContentResolverresolver=this.getContext().getContentResolver();
-
ContentValuesvalues=newContentValues();
-
values.put("data1",phone);
-
resolver.update(uri,values,"mimetype=?andraw_contact_id=?",newString[]{"vnd.android.cursor.item/phone_v2",id+""})
-
}
分享到:
相关推荐
基于安卓开发和设计的一款APP,实现手机通讯录的功能,实现通讯录头像图片的上传与显示,增删改查通讯录人员功能基于安卓开发和设计的一款APP,实现手机通讯录的功能,实现通讯录头像图片的上传与显示,增删改查...
JSP增删改查 -简易通讯录 JSP增删改查 -简易通讯录
对安卓手机通讯录中的联系人进行增、删、改、查等操作,本资源只有一个java工具类,不是完整的项目,支持根据手机号查询联系人对应的RawContactId.
利用python,写的一个简单的通讯录程序,可以进行增删改查。
java语言实现简单的QQ通讯录,具有增删改查功能,无图形化界面,导入eclipse即可使用
C++通讯录管理系统(对文件进行增删改查).pdf
greendao 实现增删改查功能,代码简单易懂,android studio 工程
Servlet(增删改查)模拟网络通讯录
个人总结的通讯录操作的增删改查,里面包含两种progressdialog的用法,使用原生的和自定义的。没有具体的update方法,看完后我想你们自己应该可以写出来updata方法了,界面呢不是太好看,勿喷啊!删除和查询我添加了...
自己学习Android的时候写的项目: 安卓电话簿课程设计(实现对联系人的增删改查)
用java编写的通讯录,能实现增删改查等功能
java 简单QQ通讯录具有增删改查功能.zipjava 简单QQ通讯录具有增删改查功能.zip
android 增删改查
根据Android数据存储的内容,综合应用SharedPreferences和SQLite数据库实现一个用户信息管理系统,强化对SharedPreferences的理解的使用,熟练掌握SQLite的操作。 要求: 1. 巩固Android应用开发工具(Eclipse或者...
对简单的通讯录信息进行增删改查,适合Java初学者使用,通俗易懂
java实现对xml文件的增 删 改 查 操作
基于MySQL数据库的增删改查,实现对一个在数据库中的表格进行增加、删除、修改、查看等基本操作
一个用来初学的通讯录模板,实现了增删查改功能
【Android】Sqlite数据库增删改查工程源代码(修改版)
1:Android运用SQL数据库对数据经行简单的增删改查,并把最终结果显示在对应的区域! 2:四个功能条例清晰,方法陈列工整,让看起来更加易懂! 3:压缩包解压后直接打开AndroidStudio软件导入即可运行,100%包运行!...