内容提供者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<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
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, "lisi@126.cn")
.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()来打印你所有的列,然后去数据库中找寻相对应的值