ContentProvider学习心得(中)--通过单元测试的方式完成对通讯录内容的操作

本文通过实例演示如何使用Android的ContentProvider操作通讯录数据,包括单条记录添加及批量处理方式,介绍了涉及的关键表结构及字段意义。

在基本了解了对内容提供者的操作之后,可以通过几个小例子来训练自己的所学。在很多应用中都需要访问通讯录,因此在这里我们通过单元测试和通讯录的内容提供者完成对通讯录中数据的操作,在通讯录数据库中有很多表,在这个例子中我们需要关注的是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);
	}
	
	
	
	
	
	
	
	

}



<!-- Baidu Button BEGIN -->
更多
<!-- Baidu Button END --> <!--192.168.100.33-->
上一篇: android组件ContentProvider学习心得(上) 下一篇: ContentProvider学习笔记(下)--查看内存卡上的图片
<!-- Baidu Button BEGIN --> <script type="text/javascript" id="bdshare_js" data="type=tools&amp;uid=1536434"></script><script type="text/javascript" id="bdshell_js"></script><script type="text/javascript"> document.getElementById("bdshell_js").src = "http://bdimg.share.baidu.com/static/js/shell_v2.js?cdnversion=" + Math.ceil(new Date()/3600000) </script><!-- Baidu Button END -->
1. 测试环境的搭建(DBunit+HSQLDB) 1 1.1. DBunit的简介 1 1.1.1. DBunit简单介绍和原理 1 1.1.2. DBunit的三大核心组件 1 1.1.3. DBunit的安装使用 2 1.2. HSQLDB简介 3 1.2.2. 什么是HSQLDB 3 1.2.3. HSQLDB安装和使用 5 1.2.4. HSQLDB使用 7 1.2.5. HSLDB的使用注意事项 8 2. 数据库单元测试测试流程介绍 1 2.1. 数据库单元测试的原因 1 2.2. 测试关注点 1 2.3. 测试流程 1 3. 数据库单元测试最佳实践 2 3.1. 数据库单元测试最佳实践 2 3.1.1. 从“易测试的”应用程序体系结构开始。 2 3.1.2. 使用精确的断言。 2 3.1.3. 外化断言数据。 3 3.1.4. 编写全面的测试。 4 3.1.5. 创建稳定、有意义的测试数据集。 5 3.1.6. 创建专用的测试库。 6 3.1.7. 有效地隔离测试。 7 3.1.8. 分割测试套件。 8 3.1.9. 使用适当的框架(如 DbUnit)简化过程。 9 3.2. DBunit使用最佳实践 9 3.2.1. 每一个开发人员需要搞一个数据库实例。 9 3.2.2. 使用XML文件作为DataSet 9 3.2.3. DBUnit的最佳实践是尽可能使用最小的数据集。 10 3.2.4. DatabaseOperation.CLEAN_INSERT 策略 10 3.2.5. 为相互关联的测试场景创建多个种子文件是一个很有效的策略. 10 3.3. 自我总结 10 3.3.1. 对各种类型的方法的测试策略: 10 3.3.2. 写一个基TestCase。 10 3.3.3. 测试数据库的有效方法。 10 3.3.4. seed文件的设置 10 3.3.5. 一般的测试的步骤 11 4. 常见问题 1 4.1. DBUnit使用问题 1 4.1.1. 在运行测试用例的时候,出现org.dbunit.dataset.DataSetException: java.net.MalformedURLException at……………类似的异常? 1 4.1.2. 在运行测试用例的时候,出现SQLException,并且对应的sqlstate:23504,这是为什么? 1 4.2. HSQLDB相关的问题 1 4.2.1. 抛出:java.sql.SQLException: socket creation error 1 4.3. 其他问题 1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值