contentProvider-联系人的CURD

1.联系人的查找

返回一个ArrayList<HashMap<String,  String>>类型

//通过管理联系人的URI获取游标对象
        Cursor cursor= getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
        ArrayList<HashMap<String, String>> contactData = new ArrayList<HashMap<String, String>>();
        while (cursor.moveToNext()) {
            String contactId=cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));
            String contactName=cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)).trim();
            String contactPhone=null;
            //通过管理联系人电话的URI获取游标对象
            Cursor cursorForPhone=getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID+"="+contactId, null, null);
            if(cursorForPhone.moveToFirst()){
                contactPhone=cursorForPhone.getString(cursorForPhone.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)).replaceAll(" ", "");
            }
            cursorForPhone.close();
            //删除无效联系人
            if(contactPhone==null){
                int id=getContentResolver().delete(ContactsContract.RawContacts.CONTENT_URI, ContactsContract.Contacts._ID+"="+contactId, null);
                Toast.makeText(contactList.this,"无效联系人"+contactName+"已清空"+id, Toast.LENGTH_SHORT).show();
                continue;
            }
            HashMap<String, String> contact=new HashMap<String, String>();
            contact.put("uid", contactId);
            contact.put("name", contactName);
            contact.put("phone", contactPhone);

            contactData.add(contact);
        }
        cursor.close();
        return contactData;

 

以上demo也包含了联系人的删除

2.联系人的添加

String contactName=name.getText().toString().trim();
        String contactPhone=phone.getText().toString().trim();
        ArrayList<ContentProviderOperation> operation=new ArrayList<ContentProviderOperation>();
        //在raw_contacts主表中添加一条数据
        ContentProviderOperation op1= ContentProviderOperation.newInsert(RawContacts.CONTENT_URI)
        .withValue("account_id", null)
        .build();
        operation.add(op1);

        //在data表中添加一条联系人姓名类型的数据
        ContentProviderOperation op2= ContentProviderOperation.newInsert(Data.CONTENT_URI)
                .withValueBackReference(Data.RAW_CONTACT_ID, 0)
                .withValue(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE)
                .withValue(StructuredName.GIVEN_NAME, contactName)
                .build();
        operation.add(op2);
        //在data表中添加一条电话类型的数据
        ContentProviderOperation op3= ContentProviderOperation.newInsert(Data.CONTENT_URI)
                .withValueBackReference(Data.RAW_CONTACT_ID, 0)
                .withValue(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE)
                .withValue(Phone.NUMBER, contactPhone)
                .withValue(Phone.TYPE, Phone.TYPE_MOBILE)
                .build();
        operation.add(op3);

        try{
            //执行上面的操作,该方法会开启事务
            getContentResolver().applyBatch("com.android.contacts", operation);
            Toast.makeText(AddContact.this, "添加成功!", Toast.LENGTH_SHORT).show();
        } catch (RemoteException | OperationApplicationException e) {
            e.printStackTrace();
        }

对于联系人的操作,其实是对于data/data/com.android.providers.contacts/databases/contacts2.db的操作

主要需要了解的几张表:contacts,raw_contacts,data,mimetype,对于通话记录的操作,则需要该文件下的calls等表操作。

涉及到的URI:

Contacts.CONTENT_URI

  对应contacts表,主要是联系人的主要信息

    以上的图只截取了部分内容

Data.CONTENT_URI

对应data表中的数据

 

    上图中可以看出有些phone数据类型错误,成了name类型,这也是之前电话号码不显示的原因

CommonDataKinds.Phone.CONTENT_URI

  对应的是data表中,类型为电话号码的数据

 

CommonDataKinds.Email.CONTENT_URI

  对应的是data表中,类型为电话号码的数据

 

RawContacts.CONTENT_URI

  对应raw_contacts表中的数据

这个只是android中ContentProvider的一个应用,还有许多应用也通过ContentProvider共享了它们的数据

时间: 2024-10-08 19:19:37

contentProvider-联系人的CURD的相关文章

关于ContentProvider的一些例子(获取联系人)

ContentResolver:是Android的四大组件之一,主要用于对外共享数据. Android提供了一些主要数据类型的ContentProvider,比如音频.视频.图片和私人通讯录等.前提是已经获取其权限. 主要方法 public boolean onCreate() 在创建ContentProvider时调用public Cursor query(Uri, String[], String, String[], String) 查询ContentProvider,返回一个Cursor

android面试之contentProvider获取联系人

1.使用contentprovider查找联系人 MainActivity.java public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); getContacts(); } privat

Android 开发 ContentProvider 获取歌曲列表和联系人的样例

ContentProvider(内容提供者)是Android中的四大组件之中的一个. 主要用于对外共享数据.也就是通过ContentProvider把应用中的数据共享给其它应用訪问.其它应用能够通过ContentProvider对指定应用中的数据进行操作.ContentProvider分为系统的和自己定义的,系统的也就是比如联系人,图片等数据. 下面这段是Google Doc中对ContentProvider的大致概述. 内容提供者将一些特定的应用程序数据供给其他应用程序使用. 数据能够存储于文

Android(java)学习笔记249:ContentProvider使用之获得系统联系人信息

1.系统联系人的数据库(3张最重要的表) (1)raw_contacts  联系人表        保存联系人的id   contact_id (2)data 数据表       保存联系人的数据 (3)mimetypes       MIME数据类型表 2.思考? 如何获取联系人的数据. (1) 查询raw_contacts  获取所有的联系人的id : (2)  根据id查询data表,获取当前联系人的数据 :     3.因为如果要访问ContentProvider,必须要了解URI的设置

Android学习笔记二十一.使用ContentProvider实现数据共享(四).操作系统(联系人)的ContentProvider

Android系统本身提供了大量的ContentProvider,例如联系人信息.系统的多媒体信息等,我们开发的应用程序主要是通过ContentResolver来调用系统的ContentProvider提供的query().insert().update()和delete()方法来获取Android内部的数据. 一.如何使用ContentResolver操作系统ContentProvider暴露的内部数据? 1.调用Activity的getContentResolver()获取ContentRe

基础总结篇之六:ContentProvider之读写联系人

靡不有初,鮮克有終.<詩經> 很多事情,绝大多数人都会在开始的时候满怀热情,而能坚持到底的却是寥寥无几.对待自己的目标,虎头蛇尾绝不可取,半途而废只会一无所成,我们必须持之以恒的做下去,坚持到底才能摘取胜利的果实.最近也忙了起来,忙着给自己充电,深知这项任务的艰巨,不是一天两天的事,所以也借用这句警言来告诫自己,坚持不懈的走下去. 今天我们来讲解一下如何利用ContentProvider机制读写联系人信息. 在Android中,ContentProvider是一种数据包装器,适合在不同进程间实

Android(java)学习笔记251:ContentProvider使用之添加数据到联系人

1.添加联系人逻辑思路 (1)首先在raw_contacts创建一个新的id (2)在data表里面添加这个id对应的数据 2.下面通过一个案例,说明一下如何添加一条数据到联系人: (1)首先我们关注一下布局文件,activity_main.xml,如下: 1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 2 xmlns:tools="http://schemas.a

android菜鸟学习笔记23----ContentProvider(三)利用内置ContentProvider监听短信及查看联系人

要使用一个ContentProvider,必须要知道的是它所能匹配的Uri及其数据存储的表的结构. 首先想办法找到访问短信及联系人数据的ContentProvider能接受的Uri: 到github上找对应ContentProvider的源码:https://github.com/android 有好多个,哪一个才是短信数据的ContentProvider呢? 在filters输入框:输入telephony. 现在只有一个了,打开: 装有git的话,可以选择clone到本地,没有的话,就选择下载

Android-数据存储(Content Provider ,调用系统 联系人 ContentProvider实现查询和增加联系人)

1.回顾 上篇学习了 安卓的 文件存储 ,包括  存储在 sd卡上: 2.重点 (1)了解 四大组件之一 Content Provider (2)实现 查询通信录中 联系人 (3)实现 新增联系人到通信录 3.介绍 (1) ContentProvider相对于其它的方式比较复杂,当然其功能相对于其它的方式也是革命性的改变. (2)它能够实现跨应用之间的数据操作. (3)利用ContentResolver对象的delete.update.insert.query等方法去操作 ContentProv

Android 开发 ContentProvider 获取歌曲列表和联系人的例子

ContentProvider(内容提供者)是Android中的四大组件之一.主要用于对外共享数据,也就是通过ContentProvider把应用中的数据共享给其他应用访问,其他应用可以通过ContentProvider对指定应用中的数据进行操作.ContentProvider分为系统的和自定义的,系统的也就是例如联系人,图片等数据. 以下这段是Google Doc中对ContentProvider的大致概述. 内容提供者将一些特定的应用程序数据供给其它应用程序使用.数据可以存储于文件系统.SQ