Android 通讯录增删改查

Android入门之增删改查通讯录

一、通讯录应用介绍


通讯录应用是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,以及要访问通讯录需要的权限;

 

  1. <uses-permission android:name="android.permission.READ_CONTACTS" />
  2. <uses-permission android: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)根据电话号码查询姓名

  1. //根据电话号码查询姓名(在一个电话打过来时,如果此电话在通讯录中,则显示姓名)
  2. public void testReadNameByPhone(){
  3. String phone = "12345678";
  4. //uri= content://com.android.contacts/data/phones/filter/#
  5. Uri uri = Uri.parse("content://com.android.contacts/data/phones/filter/"+phone);
  6. ContentResolver resolver = this.getContext().getContentResolver();
  7. Cursor cursor = resolver.query(uri, new String[]{Data.DISPLAY_NAME}, null, null, null); //从raw_contact表中返回display_name
  8. if(cursor.moveToFirst()){
  9. Log.i("Contacts", "name="+cursor.getString(0));
  10. }
  11. }

(2)查询所有的联系人


  1. //读取通讯录的全部的联系人
  2. //需要先在raw_contact表中遍历id,并根据id到data表中获取数据
  3. public void testReadAll(){
  4. //uri = content://com.android.contacts/contacts
  5. Uri uri = Uri.parse("content://com.android.contacts/contacts"); //访问raw_contacts表
  6. ContentResolver resolver = this.getContext().getContentResolver();
  7. Cursor cursor = resolver.query(uri, new String[]{Data._ID}, null, null, null); //获得_id属性
  8. while(cursor.moveToNext()){
  9. StringBuilder buf = new StringBuilder();
  10. int id = cursor.getInt(0);//获得id并且在data中寻找数据
  11. buf.append("id="+id);
  12. uri = Uri.parse("content://com.android.contacts/contacts/"+id+"/data"); //如果要获得data表中某个id对应的数据,则URI为content://com.android.contacts/contacts/#/data
  13. Cursor cursor2 = resolver.query(uri, new String[]{Data.DATA1,Data.MIMETYPE}, null,null, null); //data1存储各个记录的总数据,mimetype存放记录的类型,如电话、email等
  14. while(cursor2.moveToNext()){
  15. String data = cursor2.getString(cursor2.getColumnIndex("data1"));
  16. if(cursor2.getString(cursor2.getColumnIndex("mimetype")).equals("vnd.android.cursor.item/name")){ //如果是名字
  17. buf.append(",name="+data);
  18. }
  19. else if(cursor2.getString(cursor2.getColumnIndex("mimetype")).equals("vnd.android.cursor.item/phone_v2")){ //如果是电话
  20. buf.append(",phone="+data);
  21. }
  22. else if(cursor2.getString(cursor2.getColumnIndex("mimetype")).equals("vnd.android.cursor.item/email_v2")){ //如果是email
  23. buf.append(",email="+data);
  24. }
  25. else if(cursor2.getString(cursor2.getColumnIndex("mimetype")).equals("vnd.android.cursor.item/postal-address_v2")){ //如果是地址
  26. buf.append(",address="+data);
  27. }
  28. else if(cursor2.getString(cursor2.getColumnIndex("mimetype")).equals("vnd.android.cursor.item/organization")){ //如果是组织
  29. buf.append(",organization="+data);
  30. }
  31. }
  32. String str = buf.toString();
  33. Log.i("Contacts", str);
  34. }
  35. }

2.Insert

(1)一步一步添加数据


  1. //一步一步添加数据
  2. public void testAddContacts(){
  3. //插入raw_contacts表,并获取_id属性
  4. Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");
  5. ContentResolver resolver = this.getContext().getContentResolver();
  6. ContentValues values = new ContentValues();
  7. long contact_id = ContentUris.parseId(resolver.insert(uri, values));
  8. //插入data表
  9. uri = Uri.parse("content://com.android.contacts/data");
  10. //add Name
  11. values.put("raw_contact_id", contact_id);
  12. values.put(Data.MIMETYPE,"vnd.android.cursor.item/name");
  13. values.put("data2", "zdong");
  14. values.put("data1", "xzdong");
  15. resolver.insert(uri, values);
  16. values.clear();
  17. //add Phone
  18. values.put("raw_contact_id", contact_id);
  19. values.put(Data.MIMETYPE,"vnd.android.cursor.item/phone_v2");
  20. values.put("data2", "2"); //手机
  21. values.put("data1", "87654321");
  22. resolver.insert(uri, values);
  23. values.clear();
  24. //add email
  25. values.put("raw_contact_id", contact_id);
  26. values.put(Data.MIMETYPE,"vnd.android.cursor.item/email_v2");
  27. values.put("data2", "2"); //单位
  28. values.put("data1", "xzdong@xzdong.com");
  29. resolver.insert(uri, values);
  30. }



(2)批量添加数据

核心代码:
(1)ContentProviderOperation operation = ContentProviderOperation.newInsert(uri).withValue("key","value").build();
(2)resolver.applyBatch("authorities",operations);//批量提交


  1. <span style="font-size:18px;">public void testAddContactsInTransaction() throws Exception {
  2. Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");
  3. ContentResolver resolver = this.getContext().getContentResolver();
  4. ArrayList<ContentProviderOperation> operations = new ArrayList<ContentProviderOperation>();
  5. // 向raw_contact表添加一条记录
  6. //此处.withValue("account_name", null)一定要加,不然会抛NullPointerException
  7. ContentProviderOperation operation1 = ContentProviderOperation
  8. .newInsert(uri).withValue("account_name", null).build();
  9. operations.add(operation1);
  10. // 向data添加数据
  11. uri = Uri.parse("content://com.android.contacts/data");
  12. //添加姓名
  13. ContentProviderOperation operation2 = ContentProviderOperation
  14. .newInsert(uri).withValueBackReference("raw_contact_id", 0)
  15. //withValueBackReference的第二个参数表示引用operations[0]的操作的返回id作为此值
  16. .withValue("mimetype", "vnd.android.cursor.item/name")
  17. .withValue("data2", "xzdong").build();
  18. operations.add(operation2);
  19. //添加手机数据
  20. ContentProviderOperation operation3 = ContentProviderOperation
  21. .newInsert(uri).withValueBackReference("raw_contact_id", 0)
  22. .withValue("mimetype", "vnd.android.cursor.item/phone_v2")
  23. .withValue("data2", "2").withValue("data1", "0000000").build();
  24. operations.add(operation3);
  25. resolver.applyBatch("com.android.contacts", operations);
  26. }</span>

3.Delete


核心思想:
(1)先在raw_contacts表根据姓名查出id;
(2)在data表中只要raw_contact_id匹配的都删除;

  1. public void testDelete()throws Exception{
  2. String name = "xzdong";
  3. //根据姓名求id
  4. Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");
  5. ContentResolver resolver = this.getContext().getContentResolver();
  6. Cursor cursor = resolver.query(uri, new String[]{Data._ID},"display_name=?", new String[]{name}, null);
  7. if(cursor.moveToFirst()){
  8. int id = cursor.getInt(0);
  9. //根据id删除data中的相应数据
  10. resolver.delete(uri, "display_name=?", new String[]{name});
  11. uri = Uri.parse("content://com.android.contacts/data");
  12. resolver.delete(uri, "raw_contact_id=?", new String[]{id+""});
  13. }
  14. }


4.Update


核心思想:

(1)不需要更新raw_contacts,只需要更新data表;

(2)uri=content://com.android.contacts/data 表示对data表进行操作;

[java] view plaincopyprint?
  1. public void testUpdate()throws Exception{
  2. int id = 1;
  3. String phone = "999999";
  4. Uri uri = Uri.parse("content://com.android.contacts/data");//对data表的所有数据操作
  5. ContentResolver resolver = this.getContext().getContentResolver();
  6. ContentValues values = new ContentValues();
  7. values.put("data1", phone);
  8. resolver.update(uri, values, "mimetype=? and raw_contact_id=?", new String[]{"vnd.android.cursor.item/phone_v2",id+""})
  9. }

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Android Studio通讯录增删改查是指在Android Studio开发环境下,通过编写代码实现对通讯录的增加、删除、修改和查询操作。具体实现方法包括使用SQLite数据库存储通讯录信息、编写Java代码实现增删改查功能、使用Android Studio提供的UI设计工具设计通讯录界面等。通过这些操作,可以实现一个功能完善的通讯录应用程序。 ### 回答2: Android Studio通讯录是一款非常实用的应用程序,可以方便用户管理自己的联系人信息,包括增加、删除、修改和查找。下面我将详细介绍如何实现这些功能。 一、增加联系人 1.创建一个名为Contact的类来存储联系人的信息,包括姓名、电话号码、电子邮件等。 2.创建一个Activity来让用户输入新增联系人的信息,包括姓名、电话号码和电子邮件。 3.在Activity中使用Intent的startActivityForResult方法来调用系统自带的联系人选取器,这样用户就可以选择一个已有的联系人,或者新增一个联系人。 4.在Activity的onActivityResult方法中接收data参数,从中获取选择的联系人的信息,并将其存储到Contact类中。 5.使用SQLite数据库来存储新增联系人的信息,将Contact对象转化为ContentValues对象,并使用insert方法将其插入到数据库中。 二、删除联系人 1.创建一个Activity来显示所有已有的联系人信息,并在每个联系人信息的旁边添加一个删除按钮。 2.通过SQLite数据库查询所有已有的联系人信息,并使用ListView来展示。 3.为每个联系人信息的删除按钮添加一个点击事件,当用户点击该按钮时,从数据库中删除该联系人信息。 三、修改联系人 1.创建一个Activity来显示所有已有的联系人信息,并在每个联系人信息的旁边添加一个编辑按钮。 2.通过SQLite数据库查询所有已有的联系人信息,并使用ListView来展示。 3.为每个联系人信息的编辑按钮添加一个点击事件,当用户点击该按钮时,将相关信息传递给另一个Activity来进行编辑。 4.在编辑Activity中,使用Intent获取传递过来的联系人信息,并显示在相关的EditText中。 5.用户编辑完毕后,将修改后的信息存储到Contact类中,并使用update方法更新数据库中的数据。 四、查找联系人 1.创建一个Activity来让用户输入要查找的联系人的关键字。 2.使用SQLite数据库的模糊查询功能来查询与关键字匹配的联系人信息,并使用ListView来展示。 3.为ListView中的每个联系人信息添加一个点击事件,点击后跳转到编辑页面进行修改。 通过以上操作,用户可以方便地管理自己的联系人信息,实现了联系人的增加、删除、修改和查找。 ### 回答3: 在 Android 开发中,通讯录是一个基本功能之一。Android Studio 是一个流行的开发环境,可以通过它来实现通讯录增删改查功能。 通讯录需要存储联系人的信息,如姓名、电话、邮箱、地址等。这些信息可以存储在 SQLite 数据库中,使用 Android 的 Content Provider API 来实现对数据库的操作。以下是通讯录的实现步骤: 1. 创建 SQLite 数据库:在 Android Studio 中,可以使用 SQLiteOpenHelper 类来创建和管理数据库。需要定义数据表的结构,并重写 onCreate 和 onUpgrade 方法,以便在需要的时候创建或更新数据库。 2. 创建 Content Provider:Content Provider 是 Android 中一种数据访问方式,可以让应用程序之间共享数据。需要实现 Content Provider 的基本方法:query、insert、delete 和 update,以便对数据库进行增删改查操作。 3. 创建联系人列表界面:使用 Android Studio 中的 RecyclerView 控件来显示联系人列表。通过 Content Provider 提供的查询接口,获取联系人列表数据,并将其显示在 RecyclerView 中。 4. 创建联系人详情界面:通过点击 RecyclerView 中的某个联系人,将其对应的联系人详情界面打开。可以使用 Intent 传递手机号码或唯一标识符来获取联系人详情数据,并将其显示在布局中。 5. 添加联系人界面:使用 Android Studio 中的 EditText 和 Button 组件来创建添加联系人界面。获取用户输入的联系人信息,并通过 Content Provider 的插入接口将其保存到数据库中。 6. 删除联系人界面:在联系人详情界面中,添加一个删除按钮。通过 Content Provider 的删除接口,将当前联系人从数据库中删除。 7. 编辑联系人界面:在联系人详情界面中,添加一个编辑按钮。创建编辑联系人界面,获取用户对联系人信息的修改,通过 Content Provider 的更新接口将修改后的联系人信息保存到数据库中。 通过上述步骤,我们可以实现 Android Studio 中的通讯录增删改查功能。在实现过程中,需要注意数据安全和合理的异常处理。通讯录是一个常用的功能,掌握其实现方法和技巧对于提升 Android 开发能力和技术水平是十分重要的。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值