在基本了解了对内容提供者的操作之后,可以通过几个小例子来训练自己的所学。在很多应用中都需要访问通讯录,因此在这里我们通过单元测试和通讯录的内容提供者完成对通讯录中数据的操作,在通讯录数据库中有很多表,在这个例子中我们需要关注的是data,raw_contacts,mimetypes这三个表,data表格raw_contacts两个表通过raw_contact_id字段关联,关于表中的字段,在通讯录URI详解中有介绍,mimetypes这个表指定data表中,每一条记录所对应的含义,例如“vnd.android.cursor.item/name”指定了data表中相应行记录的是联系人姓名的相关信息。同时需要指出的是,在添加记录的时候,需要指定添加的每条记录类型是什么,因此需要ContentValues中绑定mimetype字段,其中的值可以在mimetypes表中查询,在将记录插入到数据库之后,数据库会自动的根据mimetype的值设定data中记录的mimetype_id。
下面一共有个测试方法,在第一种测试方法中,联系人的每一个信息都是分开添加的,第二种测试方法中,采用批处理的方法来完成联系人的添加。
下面是测试的代码
package com.example.test;
import java.util.ArrayList;
import android.content.ContentProvider;
import android.content.ContentProviderOperation;
import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.ContentValues;
import android.net.Uri;
import android.provider.ContactsContract;
import android.test.AndroidTestCase;
public class ContactsProviderTest extends AndroidTestCase {
public void testAddContacts(){
ContentValues values = new ContentValues();
Uri uri = this.getContext().getContentResolver().insert(Uri.parse("content://com.android.contacts/raw_contacts"), values);
long row = ContentUris.parseId(uri);
values.clear();
values.put("raw_contact_id", row);
values.put("mimetype","vnd.android.cursor.item/name");
values.put("data1", "Neway");
this.getContext().getContentResolver().insert(Uri.parse("content://com.android.contacts/data"), values);
values.clear();
values.put("raw_contact_id", row);
values.put("mimetype","vnd.android.cursor.item/phone_v2");
values.put("data1","15172546339");
this.getContext().getContentResolver().insert(Uri.parse("content://com.android.contacts/data"), values);
}
/*
* 采用批处理的方法对添加添加联系人进行操作。
*/
public void testAddContacts2() throws Exception{
Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");
ContentResolver resolver = this.getContext().getContentResolver();
ArrayList <ContentProviderOperation> operations = new ArrayList<ContentProviderOperation>();
ContentValues values = new ContentValues();
ContentProviderOperation operation1 = ContentProviderOperation.newInsert(uri).withValues(values).build();
operations.add(operation1);
ContentProviderOperation operation2 = ContentProviderOperation.newInsert(Uri.parse("content://com.android.contacts/data"))
.withValueBackReference("raw_contact_id", 0)//将第一次操作返回的结果赋值给raw_contact_id
.withValue("mimetype", "vnd.android.cursor.item/name")
.withValue("data1", "Colorful").build();
operations.add(operation2);
ContentProviderOperation operation3 = ContentProviderOperation.newInsert(Uri.parse("content://com.android.contacts/data"))
.withValueBackReference("raw_contact_id", 0)
.withValue("mimetype","vnd.android.cursor.item/phone_v2")
.withValue("data1","15516689456")
.build();
operations.add(operation3);
ContentProviderOperation operation4 = ContentProviderOperation.newInsert(Uri.parse("content://com.android.contacts/data"))
.withValueBackReference("raw_contact_id", 0)
.withValue("mimetype","vnd.android.cursor.item/email_v2")
.withValue("data1","cuiColorful@sina.com")
.build();
operations.add(operation4);
resolver.applyBatch("com.android.contacts", operations);
}
}