2.创建待测试的ContentProvider组件
  1).Family.java文件中的代码主要定义相关的数据库表列字段名和Uri,代码如下:
package com.steven.hu.cpt;
import android.net.Uri;
import android.provider.BaseColumns;
public class Family
{
//定义Authority,与AndroidManifest.xml文件中定义的一致
public static final String AUTHRITY = "com.steven.hu.provider.test";
public static final class Member implements BaseColumns
{
//定义表的数据列字段
public static final String _ID = "_id";
public static final String NAME = "name";
public static final String AGE = "age";
public static final String GENDER = "gender";
//面向整个表的uri
public static final Uri FAMILY_CONTENT_URI =
Uri.parse("content://" + AUTHRITY + "/family");
//面向单条记录数据的uri
public static final Uri MEMBER_CONTENT_URI =
Uri.parse("content://" + AUTHRITY + "/member/");
//表名
public static final String TABLE_NAME = "genealogy";
}
}
  2).ProviderToBeTest.java中的代码实现为待测试的ContentProvider组件,代码如下:
package com.steven.hu.cpt;
import android.content.ContentProvider;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.Context;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.net.Uri;
import android.util.Log;
public class ProviderToBeTest extends ContentProvider
{
private static final int DATABASE_VERSION = 2;
private static final String DATABASE_NAME = "family_info.db";
private static final String TAG = "ProviderToBeTest";
private DatabaseHelper mOpenHelper;
private static UriMatcher sMatcher = new UriMatcher(UriMatcher.NO_MATCH);
private static final int FAMILY = 1;
private static final int MEMBER = 2;
static
{
sMatcher.addURI(Family.AUTHRITY, "family", FAMILY);
sMatcher.addURI(Family.AUTHRITY, "member/#", MEMBER);
}
@Override
public boolean onCreate()
{
// TODO Auto-generated method stub
mOpenHelper = new DatabaseHelper(getContext());
return true;
}
// 插入数据
@Override
public Uri insert(Uri uri, ContentValues values)
{
SQLiteDatabase db = mOpenHelper.getWritableDatabase();
switch (sMatcher.match(uri))
{
// 如果Uri参数代表操作全部数据项
case FAMILY:
// 插入数据,返回插入记录的ID
long rowId = db.insert(Family.Member.TABLE_NAME, Family.Member._ID, values);
// 如果插入成功返回uri
if (rowId > 0)
{
// 在已有的 Uri的后面追加ID
Uri memberUri = ContentUris.withAppendedId(uri, rowId);
// 通知数据已经改变
getContext().getContentResolver().notifyChange(memberUri, null);
return memberUri;
}
break;
default:
throw new IllegalArgumentException("未知Uri:" + uri);
}
return null;
}
// 删除数据
@Override
public int delete(Uri uri, String where, String[] whereArgs)
{
SQLiteDatabase db = mOpenHelper.getReadableDatabase();
// 记录所删除的记录数
int num = 0;
// 对于uri进行匹配。
switch (sMatcher.match(uri))
{
// 如果Uri参数代表操作全部数据项
case FAMILY:
num = db.delete(Family.Member.TABLE_NAME, where, whereArgs);
break;
// 如果Uri参数代表操作指定数据项
case MEMBER:
// 解析出所需要删除的记录ID
long id = ContentUris.parseId(uri);
String whereClause = Family.Member._ID + "=" + id;
// 如果原来的where子句存在,拼接where子句
if (where != null && !where.equals(""))
{
whereClause = whereClause + " and " + where;
}
num = db.delete(Family.Member.TABLE_NAME, whereClause, whereArgs);
break;
default:
throw new IllegalArgumentException("未知Uri:" + uri);
}
// 通知数据已经改变
getContext().getContentResolver().notifyChange(uri, null);
return num;
}
// 查询数据
@Override
public Cursor query(Uri uri, String[] projection, String where, String[] whereArgs,
String sortOrder)
{
SQLiteDatabase db = mOpenHelper.getReadableDatabase();
switch (sMatcher.match(uri))
{
// 如果Uri参数代表操作全部数据项
case FAMILY:
// 执行查询
return db.query(Family.Member.TABLE_NAME, projection, where, whereArgs, null, null, sortOrder);
// 如果Uri参数代表操作指定数据项
case MEMBER:
// 解析出想查询的记录ID
long id = ContentUris.parseId(uri);
String whereClause = Family.Member._ID + "=" + id;
// 如果原来的where子句存在,拼接where子句
if (where != null && !"".equals(where))
{
whereClause = whereClause + " and " + where;
}
return db.query(Family.Member.TABLE_NAME, projection, whereClause, whereArgs, null, null,
sortOrder);
default:
throw new IllegalArgumentException("未知Uri:" + uri);
}
}
// 获取uri中的MIME类型
@Override
public String getType(Uri uri)
{
// TODO Auto-generated method stub
switch (sMatcher.match(uri))
{
case FAMILY:
return "famliy/com.steven.hu.genealogy";
case MEMBER:
return "member/com.steven.hu.genealogy";
default:
throw new IllegalArgumentException("未知Uri:" + uri);
}
}
// 更新数据
@Override
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs)
{
// TODO Auto-generated method stub
return 0;
}
public static class DatabaseHelper extends SQLiteOpenHelper
{
// 定义创建表的SQL语句
//final String CREATE_TABLE_SQL = "create table family(_id integer primary key autoincrement , name , age, gender)";
final String CREATE_TABLE_SQL = "CREATE TABLE genealogy"  + " ("
+ Family.Member._ID + " INTEGER PRIMARY KEY,"
+ Family.Member.NAME + " TEXT,"
+ Family.Member.AGE + " INTEGER,"
+ Family.Member.GENDER + " TEXT"
+ ");";
public DatabaseHelper(Context context)
{
super(context, DATABASE_NAME, null, DATABASE_VERSION);
// TODO Auto-generated constructor stub
}
@Override
public void onCreate(SQLiteDatabase db)
{
// TODO Auto-generated method stub
// 建表
db.execSQL(CREATE_TABLE_SQL);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
{
// TODO Auto-generated method stub
Log.w(TAG, "Upgrading database from version " + oldVersion + " to "
+ newVersion + ", which will destroy all old data");
// Kills the table and existing data
db.execSQL("DROP TABLE IF EXISTS genealogy");
// Recreates the database with a new version
onCreate(db);
}
}
public DatabaseHelper getOpenHelperForTest()
{
return mOpenHelper;
}
}