ContentProvider的单元测试的使用

  ContentProvider是android的四大组件之一,在编写代码的时候最好是加上单元测试,这样能够肯定对数据的CRUD的正确。本篇文章主要介绍ContentProvider中两个主要辅助类的使用还有单元测试的在ContentProvider中的使用。java

  须要用到的两个辅助类:UriMatcher类和ContentUris类。android

 UriMatcher类:可以对输入的uri参数就行匹配,以肯定对什么表执行什么样的操做。sql

 ContentUris类:有些方法须要返回uri,运用此类能够方便的生成uri类。app


对于单元测试,我的以为很是有必要在从此写代码的时候使用,这样能够很是准确的肯定代码的正确性。ide

使用单元测试的步骤:单元测试

 1)加入instrumentation,这个部分的代码是固定,也能够彻底在ADT提供的向导中导入。测试

   

<instrumentation
        android:name="android.test.InstrumentationTestRunner"
        android:targetPackage="com.example.android_contentprovider" >
    </instrumentation>

2)添加<uses-library>,这个部分的代码也是固定的写法。this

 <uses-library android:name="android.test.runner" />


好了,必备的知识已经讲完了,如今上代码:spa

1)生成一个SQLiteDatabase类,这个是必需的类MySQLiteOpenHelper类.net

package com.app.db; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteDatabase.CursorFactory; import android.database.sqlite.SQLiteOpenHelper; public class MySQLiteOpenHelper extends SQLiteOpenHelper { private static String DB_NAME = "test.db3"; private static int VERSION = 1; public MySQLiteOpenHelper(Context context) { super(context, DB_NAME, null, VERSION); } @Override public void onCreate(SQLiteDatabase db) {              //建表语句 String create_student = "create table student(_id integer primary key autoincrement,name varchar(10),age integer,gender vachar(10))";         db.execSQL(create_student);              //千万不能执行这句
             // db.close(); } @Override public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) { } }
 

而后添加咱们须要的MyContentProvider类:

package com.app.contentprovider;

import com.app.db.MySQLiteOpenHelper;

import android.content.ContentProvider;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;
import android.util.Log;

public class MyContentProvider extends ContentProvider {

	MySQLiteOpenHelper helper = null;

	private static UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH);

	// 匹配单条记录
	private static final int student = 1;
	// 匹配多条记录
	private static final int students = 2;

	static {
		matcher.addURI("com.app.wx", "student/#", student);

		matcher.addURI("com.app.wx", "student", students);
	}

	@Override
	public int delete(Uri uri, String selection, String[] selectionArgs) {

		SQLiteDatabase db = helper.getWritableDatabase();

		int action = matcher.match(uri);

		switch (action) {
		
		// 匹配单条记录
		case student:

			long id = ContentUris.parseId(uri);
          //获取单条记录的id号
			String delete_id = "_id=" + id;

			if (selection != null) {
				delete_id += delete_id + " and " + selection;
			}

			db.delete("student", delete_id, selectionArgs);

			break;
			
		// 匹配多条记录
		case students:

			db.delete("student", selection, selectionArgs);

			break;
		}
		
		return 0;
	}

	//必需实现这个方法,这个方法与intent有关系,之后再讲
	@Override
	public String getType(Uri uri) {

		int code = matcher.match(uri);
		switch (code) {
		case student:
			return "vnd.android.cursor.item/student_item";
		case students:
			return "vnd.android.cursor.dir/students";
		default:
			return null;
		}
	}

	@Override
	public Uri insert(Uri uri, ContentValues values) {

		SQLiteDatabase db = helper.getWritableDatabase();

		int action = matcher.match(uri);

		switch (action) {

		case students:

			long id1 = db.insert("student", "_id", values);

			Log.i("--------", ContentUris.withAppendedId(uri, id1).toString());

			return ContentUris.withAppendedId(uri, id1);

		}

		return null;
	}

	@Override
	public boolean onCreate() {

		helper = new MySQLiteOpenHelper(this.getContext());

		return true;
	}

	@Override
	public Cursor query(Uri uri, String[] projection, String selection,
			String[] selectionArgs, String orderBy) {

		SQLiteDatabase db = helper.getWritableDatabase();

		Cursor cursor = null;

		int action = matcher.match(uri);

		switch (action) {

		case students:

			cursor = db.query("student", projection, selection, selectionArgs,
					null, null, orderBy);

			break;

		}

		System.out.println("-----------count:" + cursor.getCount());

		return cursor;
	}

	@Override
	public int update(Uri uri, ContentValues values, String selection,
			String[] arg3) {

		int count = -1;

		SQLiteDatabase db = helper.getWritableDatabase();

		int action = matcher.match(uri);

		switch (action) {

		case student:
			// 以id来处理更新
			long id = ContentUris.parseId(uri);

			String id_selection = "_id=" + id;

			if (selection != null && !selection.equals("")) {

				id_selection = id_selection + " and " + values;

			}

			count = db.update("student", values, id_selection, arg3);

			System.out.println("----------count:" + count);

			break;
		}

		return count;
	}

}

这个类很长,可是执行的方法都是比较常见的CURD的方法,重要的是UriMatcher和ContentUris类的使用。


接着执行单元测试类:Test

package com.app.contentprovider;

import android.content.ContentResolver;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.test.AndroidTestCase;
import android.util.Log;

public class Test extends AndroidTestCase {

	public void insert() {

		ContentResolver resolver = this.getContext().getContentResolver();

		String str = "content://com.app.wx/student";

		ContentValues values = new ContentValues();

		values.put("name", "wzq");

		values.put("age", 18);

		values.put("gender", "boy");

		resolver.insert(Uri.parse(str), values);

	}

	public void update() {

		ContentResolver resolver = this.getContext().getContentResolver();

		String str = "content://com.app.wx/student/2";

		ContentValues values = new ContentValues();

		values.put("name", "哈哈");

		resolver.update(Uri.parse(str), values, null, null);

	}

	public void query() {

		ContentResolver resolver = this.getContext().getContentResolver();

		String str = "content://com.app.wx/student";

		Uri uri = Uri.parse(str);

		Cursor cursor = resolver.query(uri, new String[] { "_id",
				"name,age,gender" }, null, null, "_id desc");

		Log.d("------count",cursor.getCount()+"");
	}

	public void delete() {
		ContentResolver resolver = this.getContext().getContentResolver();

		String str = "content://com.app.wx/student/2";

		Uri uri = Uri.parse(str);

		long id=resolver.delete(uri, null, null);

	}

}


执行insert方法以后(执行了三次):


执行了update方法以后:

执行了query方法以后:


执行了delete方法以后:

相关文章
相关标签/搜索