Android组件系列----ContentProvider内容提供者【4】

(4)单元测试类:

这里需要涉及到另外一个知识:ContentResolver内容访问者

要想访问ContentProvider,则必须使用ContentResolver。可以通过ContentResolver来操作ContentProvider所暴露处理的接口。一般使用Content.getContentResolver()方法获取ContentResolver对象。第一段中已经提到:ContentProvider有很多对外可以访问的方法,在ContentResolver中均有同名的方法,是一一对应的。所以它也存在insert、query、update、delete等方法。于是单元测试类可以这样写:(注:单元测试如果不清楚,可以参考另外一篇文章: JUnit单元测试的使用

MyTest.java:

复制代码
  1 package com.example.contentresolvertest;
  2 
  3 import android.content.ContentResolver;
  4 import android.content.ContentValues;
  5 import android.database.Cursor;
  6 import android.net.Uri;
  7 import android.os.Bundle;
  8 import android.test.AndroidTestCase;
  9 import android.util.Log;
 10 
 11 public class MyTest extends AndroidTestCase {
 12 
 13     public MyTest() {
 14         // TODO Auto-generated constructor stub
 15 
 16     }
 17 
 18     public void calltest() {
 19         ContentResolver contentResolver = getContext().getContentResolver();
 20         Uri uri = Uri
 21                 .parse("content://com.example.contentprovidertest01.PersonContentProvider/person");
 22         Bundle bundle = contentResolver.call(uri, "method", null, null);
 23         String returnCall = bundle.getString("returnCall");
 24         Log.i("main", "-------------->" + returnCall);
 25     }
 26 
 27     //测试方法:向数据库中添加记录。如果之前没有数据库,则会自动创建
 28     public void insert() {
 29         // 使用内容解析者ContentResolver访问内容提供者ContentProvider
 30         ContentResolver contentResolver = getContext().getContentResolver();
 31         ContentValues values = new ContentValues();
 32         values.put("name", "生命贰号");
 33         values.put("address", "湖北");
 34         // content://authorities/person
 35         // http://
 36         Uri uri = Uri
 37                 .parse("content://com.example.contentprovidertest01.PersonContentProvider/person");
 38         contentResolver.insert(uri, values);
 39     }
 40 
 41     //测试方法:删除单条记录。如果要删除所有记录:content://com.example.contentprovidertest01.PersonContentProvider/person
 42     public void delete() {
 43         ContentResolver contentResolver = getContext().getContentResolver();
 44         Uri uri = Uri
 45                 .parse("content://com.example.contentprovidertest01.PersonContentProvider/person/2");//删除id为1的记录
 46         contentResolver.delete(uri, null, null);
 47     }
 48 
 49     //测试方法:根据条件删除记录。
 50     public void deletes() {
 51         ContentResolver contentResolver = getContext().getContentResolver();
 52         Uri uri = Uri
 53                 .parse("content://com.example.contentprovidertest01.PersonContentProvider/person");
 54         String where = "address=?"; 
 55         String[] where_args = { "HK" };
 56         contentResolver.delete(uri, where, where_args);  //第二个参数表示查询的条件"address=?",第三个参数表示占位符中的具体内容
 57     }
 58 
 59     //方法:根据id修改记录。注:很少有批量修改的情况。
 60     public void update() {
 61         ContentResolver contentResolver = getContext().getContentResolver();
 62         Uri uri = Uri
 63                 .parse("content://com.example.contentprovidertest01.PersonContentProvider/person/2");
 64         ContentValues values = new ContentValues();
 65         values.put("name", "李四");
 66         values.put("address", "上海");
 67         contentResolver.update(uri, values, null, null);
 68     }
 69 
 70     //方法:根据条件来修改记录。
 71     public void updates() {
 72         ContentResolver contentResolver = getContext().getContentResolver();
 73         Uri uri = Uri
 74                 .parse("content://com.example.contentprovidertest01.PersonContentProvider/person/student");
 75         ContentValues values = new ContentValues();
 76         values.put("name", "王五");
 77         values.put("address", "深圳");
 78         String where = "address=?";
 79         String[] where_args = { "beijing" };
 80         contentResolver.update(uri, values, where, where_args);
 81     }
 82 
 83     //测试方法:查询所有记录。如果要查询单条记录:content://com.example.contentprovidertest01.PersonContentProvider/person/1
 84     public void query() {
 85         ContentResolver contentResolver = getContext().getContentResolver();
 86         Uri uri = Uri
 87                 .parse("content://com.example.contentprovidertest01.PersonContentProvider/person");
 88         Cursor cursor = contentResolver.query(uri, null, null, null, null);
 89         while (cursor.moveToNext()) {
 90             Log.i("MyTest",
 91                     "--->>"
 92                             + cursor.getString(cursor.getColumnIndex("name")));
 93         }
 94     }
 95 
 96     //测试方法:根据条件查询所有记录。
 97     public void querys() {
 98         ContentResolver contentResolver = getContext().getContentResolver();
 99         Uri uri = Uri
100                 .parse("content://com.example.contentprovidertest01.PersonContentProvider/person");
101         String where = "address=?";
102         String[] where_args = { "深圳" };
103         Cursor cursor = contentResolver.query(uri, null, where, where_args,
104                 null);
105         while (cursor.moveToNext()) {
106             Log.i("main",
107                     "-------------->"
108                             + cursor.getString(cursor.getColumnIndex("name")));
109         }
110     }
111 
112 }
复制代码

既然ContetProvider实现的是跨应用访问数据,那这个测试类Test.java就应该写在另一个应用程序中才行。于是,我们新建另外一个工程文件ContentResolverTest,在里面添加单元测试,里面的代码其实和上方的Test.java的代码是一模一样的。运行单元测试,依然能在ContentResolverTest中实现对ContentProviderTest01中的CRUD.核心在于:使用应用1中的内容解析者ContentResolver访问应用2中的内容提供者ContentProvider

现在运行ContentProviderTest01中的单元测试类:

1、运行insert()方法,实现插入操作。后台打印如下:

7a532114-aa85-466f-8237-203e2b109eb2

上图中红框部分表明,这个uri就是代表内容提供者中,person表中,id为1的数据。

此时,打开file Explorer,进行查看,发现确实多了个文件:

bb395fd7-353b-4240-86fe-a484de71fa26

注意:如果SQLite中之前没有mydb.db这个数据库,当实现插入操作时,会自动创建mydb.db这个数据库,并自动创建person表(因为在PersonDao类中执行了getWritableDatabase()方法)。

现在将上图中的mydb.db导出,然后用SQLiteExpert软件打开,输入sql查询语句,就可以看到person表中的数据了:

a4b85f6c-ddf9-49a9-8d53-f6e0e32e93f9

如果再执行insert()方法,又会继续添加一条记录(id是自动增长的)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值