`

通讯录

阅读更多
增删查改操作

通过getContentResolver()得到ContentResolver
后,我们就可以通过该对象的delete,insert,updata,query等方法间接操作联系人数据库,那么,如果我们删除某些联系人,以ContactsContract.RawContacts.CONTENT_URI为例,怎么做,先来看下源码:


首先,ContentResolver调用delete();删除操作从红色部分开始

@Override
     public int delete(Uri uri, String selection, String[] selectionArgs) {
         waitForAccess();
         return super.delete(uri, selection, selectionArgs);
     }

上面的super.delete(uri, selection, selectionArgs)调用父亲方法

@Override
     public int delete(Uri uri, String selection, String[] selectionArgs) {
         int count = 0;
         boolean applyingBatch = applyingBatch();
         if (!applyingBatch) {
             mDb = mOpenHelper.getWritableDatabase();
             mDb.beginTransactionWithListener(this);
             try {
                 count = deleteInTransaction(uri, selection, selectionArgs);
                 if (count > 0) {
                     mNotifyChange = true;
                 }
                 mDb.setTransactionSuccessful();
             } finally {
                 mDb.endTransaction();
             }

            onEndTransaction();
         } else {
             count = deleteInTransaction(uri, selection, selectionArgs);
             if (count > 0) {
                 mNotifyChange = true;
             }
         }
         return count;
     }

父类回调deleteInTransaction(uri, selection, selectionArgs);删除联系人操作在这里进行。



//该方法对uri进行匹配来执行相应的删除操作,并且是在事务中完成的,,比如

//content://com.android.contacts/contacts

//content://com.android.contacts/contacts/#

// .......................................................省略

@Override
     protected int deleteInTransaction(Uri uri, String selection, String[] selectionArgs) {
            .......................................................
            .......................................................

         //我们可以在uri中的authority部分可带可选的参数ContactsContract.CALLER_IS_SYNCADAPTER

        //比如uri字符串可以写成content://com.android.contacts?ContactsContract.CALLER_IS_SYNCADAPTER=true

        // ContactsContract.CALLER_IS_SYNCADAPTER默认是false的,他告诉同步适配器如何执行删除操作。

       //如果设置为true,则delete的时候直接删除联系人,否则,默认delete时是不会立即删除RawContacts中的数据的,

       //只是把RawContacts.DELETED标志位设置为1,从它的aggregate contact中移除该raw contact,即显示联系人时不显示它的内容

        //同步联系人时,删除服务器上的raw contact,最终删除手机上已

       //标记为DELETED为1的raw contacts


         final boolean callerIsSyncAdapter = readBooleanQueryParameter(uri, ContactsContract.CALLER_IS_SYNCADAPTER, false);
         final int match = sUriMatcher.match(uri);
         switch (match) {

           .......................................................

           .......................................................

           .......................................................
             case CONTACTS: {//uri为content://com.android.contacts/contacts,目录(dir)类型

                // TODO
                 return 0;
             }

            case CONTACTS_ID: {//删除某一个联系人,uri指定了ContactsContract.Contacts中的字段contact_id,Item类型
                 long contactId = ContentUris.parseId(uri);//得到该给定联系人数据集的id
                 return deleteContact(contactId);
             }

           .......................................................

           .......................................................

           .......................................................

            case RAW_CONTACTS: {
                 int numDeletes = 0;
                 Cursor c = mDb.query(Tables.RAW_CONTACTS, new String[]{RawContacts._ID},
                         appendAccountToSelection(uri, selection), selectionArgs, null, null, null);
                 try {
                     while (c.moveToNext()) {
                         final long rawContactId = c.getLong(0);
                         numDeletes += deleteRawContact(rawContactId, callerIsSyncAdapter);
                     }
                 } finally {
                     c.close();
                 }
                 return numDeletes;
             }

            case RAW_CONTACTS_ID: {
                 final long rawContactId = ContentUris.parseId(uri);
                 return deleteRawContact(rawContactId, callerIsSyncAdapter);
             }

            case DATA: {
                 mSyncToNetwork |= !callerIsSyncAdapter;
                 return deleteData(appendAccountToSelection(uri, selection), selectionArgs,
                         callerIsSyncAdapter);
             }

            case DATA_ID:
             case PHONES_ID:
             case EMAILS_ID:
             case POSTALS_ID: {
                 long dataId = ContentUris.parseId(uri);
                 mSyncToNetwork |= !callerIsSyncAdapter;
                 return deleteData(Data._ID + "=" + dataId, null, callerIsSyncAdapter);
             }

           .......................................................

           .......................................................

           .......................................................
         }
     }


public int deleteRawContact(long rawContactId, boolean callerIsSyncAdapter) {
         if (callerIsSyncAdapter) {
             mDb.delete(Tables.PRESENCE, PresenceColumns.RAW_CONTACT_ID + "=" + rawContactId, null);

            //直接删除数据
             return mDb.delete(Tables.RAW_CONTACTS, RawContacts._ID + "=" + rawContactId, null);
         } else {

            //从他关联的aggregate contact移除该数据
             mDbHelper.removeContactIfSingleton(rawContactId);

            //标记为已删除,但不是立即删除数据
             return markRawContactAsDeleted(rawContactId);
         }
     }


综上,我们要删除联系人可以这样做:

1)删除单个联系人:

CR.delete(ContactsContract.RawContacts.CONTENT_URI,ContactsContract.RawContacts_id + "=" + delRawId);

2)删除全部联系人:

getContentResolver().delete(Uri.parse(ContactsContract.RawContacts.CONTENT_URI.toString() +"?" + ContactsContract.CALLER_IS_SYNCADAPTER+"=true"), ContactsContract.RawContacts._ID + ">0", null));

数据索引从1开始,所以只要id>0就可以全部删除raw contact记录,上面的删除操作是立即进行的,因为我们设置了true.
  • 大小: 23.1 KB
  • 大小: 26.3 KB
  • 大小: 20.6 KB
分享到:
评论

相关推荐

    商会通讯录_企业通讯录_PC桌面端下载.zip

    《商会通讯录》《企业通讯录》是一款人人可加入的线上互联网通讯录,源码下载网址http://address-book.cn 该通讯录用户可直接通过手机或PC浏览器进行访问和查看!它具有简便易用、高效安全等特点,适合个人、团体、...

    android 实现仿微信通讯录

    android 实现仿微信通讯录android 实现仿微信通讯录android 实现仿微信通讯录android 实现仿微信通讯录android 实现仿微信通讯录android 实现仿微信通讯录android 实现仿微信通讯录android 实现仿微信通讯录android ...

    ASP.NET企业通讯录&个人通讯录源码

    通讯录,企业通讯录,个人通讯录,VS2013+SQL2008, 自己解密dll后,重新整理的项目。 登录的账号 admin,密码:000000,在config文件里进行修改!!! default.aspx 首页,不需要登录,登录以后可以管理通讯录 ...

    小程序源码 通讯录 (代码源)

    小程序源码 通讯录 (代码源)小程序源码 通讯录 (代码源)小程序源码 通讯录 (代码源)小程序源码 通讯录 (代码源)小程序源码 通讯录 (代码源)小程序源码 通讯录 (代码源)小程序源码 通讯录 (代码源)小程序源码 通讯录 ...

    C#个人通讯录管理系统

    1. 管理员登录:实现管理员的登录,可查询、添加、修改、删除通讯录信息。 2. 好友登录:实现好友的登录,只可查询通讯录信息。 三、 信息查询模块 1. 按照姓名查询:按照姓名查询个人信息 2. 按照籍贯查询:...

    通讯录管理系统_面向对象_C++_通讯录管理_系统_

    【通讯录管理系统】是一个经典的信息管理项目,它利用面向对象编程技术来实现,主要目标是帮助用户方便地存储、检索和管理联系人的信息。在C++编程语言中,面向对象编程(Object-Oriented Programming,OOP)是其...

    c# 通讯录通讯录通讯录

    在C#编程中,创建一个通讯录应用是一个常见的任务,涉及到数据存储、用户界面设计以及数据操作等多个方面。以下是对这个主题的详细说明: 一、C#基础 C#是微软开发的一种面向对象的编程语言,它被广泛用于构建...

    PHP实现的通讯录管理系统设计文档+源代码+SQL文件

    PHP实现的通讯录管理系统设计文档+源代码+SQL文件PHP实现的通讯录管理系统设计文档+源代码+SQL文件PHP实现的通讯录管理系统设计文档+源代码+SQL文件PHP实现的通讯录管理系统设计文档+源代码+SQL文件PHP实现的通讯录...

    公司通讯录 同事通讯录

    《公司通讯录与同事通讯录管理系统详解》 在现代企业中,有效的信息沟通是提高工作效率、促进团队协作的关键。一个完善的公司通讯录系统能够帮助企业快速定位到所需联系人,节省时间,提高工作效能。本文将深入探讨...

    第二阶段-通讯录管理系统C++完整工程源代码

    本项目主要利用C++来实现一个通讯录管理系统,系统中需要实现的功能如下: 添加联系人:向通讯录中添加新人,信息包括(姓名、性别、年龄、联系电话、家庭住址)最多记录100人 显示联系人:显示通讯录中所有联系人...

    C#源码通讯录_通讯录_通讯录

    《C#源码实现的通讯录系统解析》 在信息技术领域,C#作为一种高效且功能强大的编程语言,常被用于开发各种类型的应用程序,其中包括个人和企业级的通讯录系统。本文将深入探讨一个基于C#编写的源码通讯录系统,通过...

    汇编语言设计通讯录

    《汇编语言设计通讯录》是一项技术性强、实践性高的编程任务,旨在通过汇编语言实现一个基础的通讯录系统,具备插入、列表显示、添加和删除联系人等基本功能。汇编语言作为计算机硬件与软件之间的桥梁,是低级编程的...

    通讯录(weui开发的)

    【标题】:“通讯录(基于weui开发的)” 在这个项目中,“通讯录”是一个采用weui框架开发的用户界面,主要用于展示和管理联系人信息。weui是中国微信团队设计的一套面向移动设备的轻量级UI框架,它提供了一系列...

    具有个性的通讯录

    【标题】:“具有个性的通讯录” 在当今数字化时代,通讯录不再仅仅是传统的纸质记录,而是演变成了一种个性化、智能化的服务。一个“具有个性的通讯录”意味着它不仅仅是一个存储联系人信息的工具,而是一个能够...

    【最新版】社群圈子通讯录v1.4.3源码-圈子拓展助手

    2021社群通讯录——圈子拓展助手 社群通讯录是一款发起联盟合作的通讯录应用。通过发起通讯录,可以帮您梳理圈子的电话、职业,供需信息等形成联盟。帮助行业圈子或微信群友认识彼此,深化关系,加强合作。 简单和微信...

    Android获取手机通讯录信息demo

    在Android平台上,获取手机通讯录信息是常见的功能需求,尤其对于开发社交类或者管理类应用来说,这是一项基本操作。本`Android获取手机通讯录信息demo`提供了简单易用的方法来实现这一功能。下面我们将详细探讨相关...

    通讯录_通讯录小代码_通讯录_

    在IT领域,通讯录是一个常见的应用,它涉及到数据结构、算法和编程技术。在这个主题下,我们将深入探讨如何实现一个简单的通讯录系统,适合初学者理解数据结构的应用。 首先,我们要明白通讯录的核心功能:存储联系...

Global site tag (gtag.js) - Google Analytics