在基本瞭解了對內容提供者的操作之後,可以通過幾個小例子來訓練自己的所學。在很多應用中都需要訪問通訊錄,因此在這裏我們通過單元測試和通訊錄的內容提供者完成對通訊錄中數據的操作,在通訊錄數據庫中有很多表,在這個例子中我們需要關注的是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","[email protected]") .build(); operations.add(operation4); resolver.applyBatch("com.android.contacts", operations); } }