Android四大组件之ContentProvider获取系统的联系人及联系人电话

内容提供者ContentProvider

ContentProvider:为存储和获取数据提供统一的接口。可以在不同的应用程序之间共享数据。Android已经为常见的一些数据提供了默认的ContentProvider

1、ContentProvider使用表的形式来组织数据
   无论数据的来源是什么,ContentProvider都会认为是一种表,然后把数据组织成表格
2、ContentProvider提供的方法
   query:查询   insert:插入   update:更新   delete:删除   getType:得到数据类型
   onCreate:创建数据时调用的回调函数
3、每个ContentProvider都有一个公共的URI,这个URI用于表示这个ContentProvider所提供的数据。Android所提供的ContentProvider都存放在android.provider包中

这里主要说下怎么通过ContentResolver来获取系统联系人

import android.content.ContentResolver;
import android.database.Cursor;
import android.net.Uri;
import android.provider.ContactsContract;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import read.liu.com.servicedemo.LogD;
import read.liu.com.servicedemo.R;

public class ContentProviderActivity extends AppCompatActivity {
    private ContentResolver contentResolver;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_content_provider);
        contentResolver = getContentResolver();
        getPeopleTel();
    }

    private void getPeopleTel() {
        Uri uri = Uri.parse("content://com.android.contacts/contacts");//看下方的解释
        Cursor cursor = contentResolver.query(uri, null, null, null, null);
        //遍历从contacts数据表中的数据集
        while (cursor.moveToNext()) {
            StringBuilder sb = new StringBuilder();
            String contactId = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));
            //得到联系人姓名
            String name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
            LogD.d(contactId + ":" + name);
            //获取联系人手机号码
            Cursor numberCursor = contentResolver.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI
                    , null
                    , ContactsContract.CommonDataKinds.Phone.CONTACT_ID + "=" + contactId
                    , null
                    , null);
            while (numberCursor.moveToNext()) {
                String phoneNum = numberCursor.getString(numberCursor.getColumnIndex("data1"));
                LogD.d(phoneNum);
            }
            //获取联系人邮箱
//            Cursor emails = contentResolver.query(ContactsContract.CommonDataKinds.Email.CONTENT_URI,
//                    null,
//                    ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = " + contactId,
//                    null, null);
        }
    }
}
添加联系人【参考别人的】
/**
     * 批量添加联系人,处于同一个事务中
     */
    public void testSave() throws Throwable{
        //文档位置:reference\android\provider\ContactsContract.RawContacts.html
        ArrayList ops = new ArrayList();
        int rawContactInsertIndex = 0;
        ops.add(ContentProviderOperation.newInsert(RawContacts.CONTENT_URI)
                .withValue(RawContacts.ACCOUNT_TYPE, null)
                .withValue(RawContacts.ACCOUNT_NAME, null)
                .build());
        
        //文档位置:reference\android\provider\ContactsContract.Data.html
        ops.add(ContentProviderOperation.newInsert(android.provider.ContactsContract.Data.CONTENT_URI)
                .withValueBackReference(Data.RAW_CONTACT_ID, rawContactInsertIndex)
                .withValue(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE)
                .withValue(StructuredName.GIVEN_NAME, "lisi")
                .build());
        ops.add(ContentProviderOperation.newInsert(android.provider.ContactsContract.Data.CONTENT_URI)
                 .withValueBackReference(Data.RAW_CONTACT_ID, rawContactInsertIndex)
                 .withValue(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE)
                 .withValue(Phone.NUMBER, "5556")
                 .withValue(Phone.TYPE, Phone.TYPE_MOBILE)
                 .withValue(Phone.LABEL, "")
                 .build());
        ops.add(ContentProviderOperation.newInsert(android.provider.ContactsContract.Data.CONTENT_URI)
                 .withValueBackReference(Data.RAW_CONTACT_ID, rawContactInsertIndex)
                 .withValue(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE)
                 .withValue(Email.DATA, "[email protected]")
                 .withValue(Email.TYPE, Email.TYPE_WORK)
                 .build());
        
        ContentProviderResult[] results = this.getContext()
                .getContentResolver().applyBatch(ContactsContract.AUTHORITY,ops);
        for (ContentProviderResult result : results) {
            Log.i(TAG, result.uri.toString());
        }
    }

contacts表也就是联系人表的URI —— scontent://com.android.contacts/contact ,对应类静态常量为ContactsContract.Contacts.CONTENT_URI
联系人电话URI —— content://com.android.contacts/data/phones ,对应静态常量为ContactsContract.CommonDataKinds.Phone.CONTENT_URI
联系人邮箱URI —— content://com.android.contacts/data/emails  ,对应静态常量为ContactsContract.CommonDataKinds.Email.CONTENT_URI
联系人地址URI —— content://com.android.contacts/data/postals  ,对应静态常量为ContactsContract.CommonDataKinds.StructuredPostall.CONTENT_URI
所有联系人的Uri —— content://contacts/people
某个联系人x的Ur —— content://contacts/people/x
data表URI —— content://com.Android.contacts/data ,对应静态常量为ContactsContract.Data.CONTENT_URI
通过  content://com.android.contacts/contacts ,你就可以查找contacts表
其中比较重要的字段有:_id-->联系人的ID
通过  content://com.android.contacts/data 你就可以查询data表
row_contact_id-->联系人的id地址
data1-->所存在联系人的名字、邮箱和出生地
data2-->指明数据的类型(一个int型,相当于mineetypes的id)。eg vnd.android.cursor.item/email_v2
minetypes-->指明具体的数据的类型
当你不知道你表中有多少数据的时候,最好就是通过cursor.getColumnnames()来打印你所有的列,然后去数据库中找寻相对应的值

你可能感兴趣的:(Android基础)