`
ck19860613
  • 浏览: 86735 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

程序代码删除联系人的分组

阅读更多
对于如何查询和设置联系人分组,可以先看看这里


要删除某一个分组,其实对于Android,比我们想象中的要简单许多。在这里只是简单的说一下用法。

在操作联系人的ContactsProvider2源码中,
protected int deleteInTransaction(Uri uri, String selection, String[] selectionArgs) {
        if (VERBOSE_LOGGING) {
            Log.v(TAG, "deleteInTransaction: "; + uri);
        }
        flushTransactionalChanges();
        final boolean callerIsSyncAdapter =
                readBooleanQueryParameter(uri, ContactsContract.CALLER_IS_SYNCADAPTER, false);
        final int match = sUriMatcher.match(uri);
        switch (match) {
            ......
            ......
            case GROUPS_ID: {
                mSyncToNetwork |= !callerIsSyncAdapter;
                return deleteGroup(uri, ContentUris.parseId(uri), callerIsSyncAdapter);
            }

            case GROUPS: {
                int numDeletes = 0;
                Cursor c = mDb.query(Tables.GROUPS, new String[]{Groups._ID},
                        appendAccountToSelection(uri, selection), selectionArgs, null, null, null);
                try {
                    while (c.moveToNext()) {
                        numDeletes += deleteGroup(uri, c.getLong(0), callerIsSyncAdapter);
                    }
                } finally {
                    c.close();
                }
                if (numDeletes > 0) {
                    mSyncToNetwork |= !callerIsSyncAdapter;
                }
                return numDeletes;
            }

            default: {
                mSyncToNetwork = true;
                return mLegacyApiSupport.delete(uri, selection, selectionArgs);
            }
        }
    }
我们可以看到删除分组的地方是方法deleteGroup(uri, ContentUris.parseId(uri), callerIsSyncAdapter);其中uri就是我们要操作的uri,这里组是ContactsContract.Groups.CONTENT_URI,ContentUris.parseId(uri)是要删除的分组id,而callerIsSyncAdapter则表示是否是直接删除Groups表的数据,还是标记该分组的deleted和dirty字段为1来表示已删除(实际删除是在同步联系人的时候进行的)。


deleteGroup方法源代码

public int deleteGroup(Uri uri, long groupId, boolean callerIsSyncAdapter) {
        mGroupIdCache.clear();
        final long groupMembershipMimetypeId = mDbHelper
                .getMimeTypeId(GroupMembership.CONTENT_ITEM_TYPE);
        mDb.delete(Tables.DATA, DataColumns.MIMETYPE_ID + "="
                + groupMembershipMimetypeId + " AND " + GroupMembership.GROUP_ROW_ID + "=" + groupId, null);

        try {
            if (callerIsSyncAdapter) {
                return mDb.delete(Tables.GROUPS, Groups._ID + "=" + groupId, null);
            } else {
                mValues.clear();
                mValues.put(Groups.DELETED, 1);
                mValues.put(Groups.DIRTY, 1);
                return mDb.update(Tables.GROUPS, mValues, Groups._ID + "=" +groupId, null);
            }
        } finally {
            mVisibleTouched = true;
        }
    }
可见,我们虽然提供的uri是Groups.CONTENT_URI,实际上android为我们进行了两步操作:

1.根据我们提供的分组delId,删除Data表中的表示分组关系的那条数据,即Data.MIMETYPE是GroupMemberShip.CONTENT_ITEM_TYPE,data1等于delId的那条数据。这样就删除了联系人与该分组的关系。

2.如果callerIsSyncAdapter=true,则删除Groups表Groups._ID为delId的数据,这样就删除了该分组;否则,标记改组数据为已删除,数据需要同步,实际删除操作在同步联系人时进行。


ContentResolver cr = mContext.getContentResolver();
于是,我们删除一个分组的时候,如果想删除某一分组关系,可以不提供callerIsSyncAdapter参数(默认为false),表示标记删除Groups表对应组数据,删除对应的Data表数据。
cr.delete(Groups.CONTENT_URI,Groups._ID+"="+groupID,null);

提供callerIsSyncAdapter参数,表示表示删除Groups表对应组数据,删除对应的Data表数据。
cr.delete(Uri.parse(ContactsContract.RawContacts.CONTENT_URI.toString() +"?" + ContactsContract.CALLER_IS_SYNCADAPTER+"=true"),Groups._ID+"="+groupID,null)

如果要删除某一个联系人与某一个分组的关系,根据源代码只需要这样做:
cr.delete(DATA.CONTENT_URI, Datas.MIMETYPE + "=" +
              GroupMembership.CONTENT_ITEM_TYPE + " AND " + 
              GroupMembership.GROUP_ROW_ID + "=" groupId, null);
1
0
分享到:
评论

相关推荐

    Java通讯录管理系统课程设计报告.docx

    删除联系人:用以删除联系人的信息以及联系人的电话号码。 5.修改联系人:提示用户输入要进行修改操作的联系人的信息,如果在文件中有该联系人存在,则将该电话号码所对应的姓名、电话号码、简介以及得票数所对应...

    Java通讯录管理系统课程设计报告(1).docx

    删除联系人:用以删除联系人的信息以及联系人的电话号码。 5.修改联系人:提示用户输入要进行修改操作的联系人的信息,如果在文件中有该联系人存在,则将该电话号码所对应的姓名、电话号码、简介以及得票数所对应...

    JAVA上百实例源码以及开源项目源代码

    Java非对称加密源码实例 1个目标文件 摘要:Java源码,算法相关,非对称加密 Java非对称加密源程序代码实例,本例中使用RSA加密技术,定义加密算法可用 DES,DESede,Blowfish等。 设定字符串为“张三,你好,我是李四”...

    基于ASP办公自动化系统源代码

    还可以对不同的联系人进行分组,方便查看。 办公自动化系统的建立,需要进行用户需求调查与分析,以确定系统目标,这是系统建设的重要环节。学校需要规模相对较小,但其在功能上对系统的需求却是全面的。大体可分为:...

    JAVA、SP、SQL SERVER2012编写的通讯录管理系统

    在线通讯录管理系统,使用dao servlet entity ...实现联系人增、删、查、改。并实现按姓名、按分组查询联系人。 开发环境:将SQL SERVER源程序附加进数据库,将代码包导入到myeclipse 并导入数据库驱动jar。即可运行

    c# QQ可执行文件,源码见另一个资源

    (15)最近联系人列表 (16)系统设置:开机自动启动、麦克风设备索引、摄像头设备索引,叉掉主窗口时关闭程序还是隐藏窗口。 (17)聊天记录:支持本地保存和服务器端保存两种方式。 (18)好友分组:新增/删除分组...

    java写的通讯录

    通讯录管理系统要求完成一个单机版的应用程序,主要功能是通讯录内容。 用户可以存储的内容包括: (1)基本信息:姓名、手机号码电子邮箱、生日、所属组、备注 、像片。 (2)工作单位:国家、省份 、城市地址...

    GG2014版源码。仿QQ聊天软件

    (15)最近联系人列表 (16)系统设置:开机自动启动、麦克风设备索引、摄像头设备索引,叉掉主窗口时 关闭程序还是隐藏窗口。 (17)聊天记录:支持本地保存和服务器端保存两种方式。 (18)好友分组:新增/...

    《iOS6开发指南》精彩书摘

    第18章“管理好你的程序代码——代码版本控制”。学习如何使用Git进行代码版本控制,其中包括Git服务器的搭建,Git常用命令,协同开发,还介绍了Xcode中配置和使用Git工具。 第19章“把你的应用放到App Store”。...

    JAVA上百实例源码以及开源项目

     Java非对称加密源程序代码实例,本例中使用RSA加密技术,定义加密算法可用 DES,DESede,Blowfish等。  设定字符串为“张三,你好,我是李四”  产生张三的密钥对(keyPairZhang)  张三生成公钥(publicKeyZhang...

    GGTalk-V6.0源码、部署版及安卓源码

    (15)最近联系人列表 (16)系统设置:开机自动启动、麦克风设备索引、摄像头设备索引,叉掉主窗口时关闭程序还是隐藏窗口。 (17)聊天记录:支持本地保存和服务器端保存两种方式。 (18)好友分组:新增/删除分组...

    C# 可在广域网部署运行的即时通讯系统GGTalk-V6.0

    (15)最近联系人列表 (16)系统设置:开机自动启动、麦克风设备索引、摄像头设备索引,叉掉主窗口时关闭程序还是隐藏窗口。 (17)聊天记录:支持本地保存和服务器端保存两种方式。 (18)好友分组:新增/删除分组...

    通讯录系统课程设计.doc

    借助于现有书籍的程序代码,本组设计了界面。 /*--------一级主菜单-----------*/ void menu() { int i; int num1;//定义num1 printf("\t…………………………#《通讯录》#…………………………\n");//界面 printf(...

    Eclipse_Swt_Jface_核心应用_部分19

    6.2 分组框(Group) 80 6.3 选项卡(TabFolder) 81 6.3.1 选项卡的基本构成 81 6.3.2 设置底部显示选项卡 82 6.3.3 设置选项卡图标 82 6.3.4 选项卡的常用方法 83 6.4 自定义选项卡(CTabFolder ) 83...

    Access+2000中文版高级编程

    13.6.4 从Access中删除Outlook中的联系人 423 13.6.5 从Access中创建Outlook日历条目 424 13.7 用DDE调用其他应用程序 425 13.7.1 理解Access中用到的DDE命令 426 13.7.2 用DDE执行复杂的Word示例 429 ...

    Access 2000中文版高级编程(part1)

    13.6.4 从Access中删除Outlook中的联系人 423 13.6.5 从Access中创建Outlook日历条目 424 13.7 用DDE调用其他应用程序 425 13.7.1 理解Access中用到的DDE命令 426 13.7.2 用DDE执行复杂的Word示例 429 13.8 小 ...

    java开源包8

    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...

Global site tag (gtag.js) - Google Analytics