uri格式:
content://包名/数据表名/id/字段
有两个方法很重要:
ContentUris.parseId();
ContentUris.withAppendedId(uri, id);
自定义内容提供者具体如下:
通过ContentProvider向其他应用程序提供数据,实现数据共享。本质是通过一个域名向其他应用程序提供访问该应用的数据库(通过调用本地应用的数据库的具体操作实现)
步骤如下:
1、定义一个ContentProvider的子类。
1.1 第一个数据库工具类SQLiteDatabase的子类用于该应用进行数据库管理。private DBHelper helper=null;
1.2定义一个Uri匹配类默认不匹配
//定义一个URI匹配类,默认为不匹配
private static final UriMatcher URI_MATCHER=new UriMatcher(UriMatcher.NO_MATCH);
1.3定义访问单条记录还是多条
private static final int STUDENT=1;//单条记录
private static final int STUDENTS=2;//多条记录
1.4利用一个静态块定义匹配规则
//定义匹配规则静态块
static{
URI_MATCHER.addURI("com.yqq.mycontentprovider2.db.StudentProvider","student", STUDENTS);
//标志位#单条记录 URI_MATCHER.addURI("com.yqq.mycontentprovider2.db.StudentProvider","student/#", STUDENT);
}
1.5利用匹配规则复写6个方法
@Override
public String getType(Uri uri) {
//匹配成功返回匹配规则的codes,不成功则返回-1
int flag=URI_MATCHER.match(uri);
switch(flag)
{
case STUDENT:
return "vnd.android.cursor.item/student";
case STUDENTS:
return "vnd.android.cursor.dir/student";
}
return null;
}
@Override
public int delete(Uri uri, String whereSelection, String[] selectinArgs) {
int count = -1;// 影响数据库的行数
try {
// 获得匹配的uri和用于执行的数据库
int flag = URI_MATCHER.match(uri);
SQLiteDatabase database = helper.getWritableDatabase();
// 删除一条还是多条记录
switch (flag) {
case STUDENT: {// 获得内容提供者的id号。
long id = ContentUris.parseId(uri);
// 获得过滤值
String whereValue = "stud_id=" + id;
// 判断过滤条件是否为空或""
if (whereSelection != null && whereSelection.equals("")) {
// 执行SQLiteDatabase的出入语句
count=database.delete("student", whereValue, selectinArgs);
}
}
break;
case STUDENTS:
{
//多行记录删除
count=database.delete("student", whereSelection, selectinArgs);
}
break;
}
} catch (Exception e) {
Log.i("内容提供者<<<","删除失败<<<<<<<<<<<<");
}
return count;
}
@Override
public Uri insert(Uri uri, ContentValues values) {
//定义一个Uri类用于返回
Uri resultUri=null;
//匹配当前传入的uri
int flag=URI_MATCHER.match(uri);
switch(flag)
{//插入多条记录
case STUDENTS:
//获得数据库
SQLiteDatabase database=helper.getWritableDatabase();
//插入数据获得插入数据的行号
long id=database.insert("student", null, values);
//通过新插入数据的行号来获取需要返回的Uri。
resultUri=ContentUris.withAppendedId(uri, id);
break;
}
Log.i(TAG,"<<<<<<<<<<<"+resultUri.toString());
return resultUri;
}
@Override
public boolean onCreate() {
//初始化一个数据库工具类子类
helper=new DBHelper(getContext());
return false;
}
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
// 定义一个游标用于查询
Cursor cursor = null;
//
try{
SQLiteDatabase database = helper.getReadableDatabase();
// 进行URI匹配
int flag = URI_MATCHER.match(uri);
// 匹配后的查询选择
switch (flag) {
//单条记录
case STUDENT: {
//获得该记录的id
long id=ContentUris.parseId(uri);
String where_value="stud_id="+id;
if(selection!=null&&selection!="")
{
where_value+="and"+selection;
}
//SQLiteDatabase进行查询
cursor=database.query("student",null, where_value, selectionArgs, null, null, null,null);
} break;
case STUDENTS:
cursor=database.query("student", null, selection, selectionArgs, null,null,null,null);
}
}catch(Exception e){
Log.i("查询<<<<", "查询错误!!!");
}
return cursor;
}
@Override
public int update(Uri uri, ContentValues values, String whereClause, String[] whereArgs) {
//受影响的数据的行数
int count=-1;
//匹配URI
int flag=URI_MATCHER.match(uri);
//获得id号
long id=ContentUris.parseId(uri);
//获得过滤条件
String whereValue="stud_id="+id;
if(whereClause!=null&&whereClause.equals(""))
{
whereValue+="and" +whereClause;
}
//获得进行操作的数据库
SQLiteDatabase database=helper.getWritableDatabase();
switch(flag)
{
//单行记录
case STUDENT:
{
//update table student set name=?id=?,addr=?where id=?
count=database.update("student", values, whereValue, whereArgs);
}
}
return count;
}
测试类:
public class Test extends AndroidTestCase {
/*public void testInsert()
{
//1、获得一个内容解析者
ContentResolver contentResolver=getContext().getContentResolver();
//2获得URI清单文件中(包名加类名加标识符)(注意加上content://)
Uri uri=Uri.parse("content://com.yqq.mycontentprovider2.db.StudentProvider/student");
//获得一个类似map的集合对象
ContentValues values=new ContentValues();
//往该集合添加数据时要注意数据的类型
values.put("stud_name", "李华");
values.put("stud_sex", "男");
values.put("stud_age", 25);
values.put("stud_phone", "13389009881");
values.put("stud_remark", "已毕业");
contentResolver.insert(uri, values);
Log.i("数据插入","数据出插入成功!!!");
}*/
/*public void testDelete()
{
//获得一个内容解析者
ContentResolver contentResolver=getContext().getContentResolver();
//获得Uri对象
//删除单条记录
//Uri uri=Uri.parse("content://com.yqq.mycontentprovider2.db.StudentProvider/student/1");
//获得Uri删除多条记录
Uri uri=Uri.parse("content://com.yqq.mycontentprovider2.db.StudentProvider/student");
int flag=contentResolver.delete(uri, null,null );
Log.i("数据删除","数据出删除成功!!!"+flag);
}*/
/*public void testUpdata()
{
//获得一个内容解析者
ContentResolver contentResolver=getContext().getContentResolver();
//获得URI
Uri uri=Uri.parse("content://com.yqq.mycontentprovider2.db.StudentProvider/student/7");
ContentValues values=new ContentValues();
values.put("stud_name", "黎明");
values.put("stud_sex", "女");
values.put("stud_age", 23);
values.put("stud_phone", "13789009881");
values.put("stud_remark", "本科在读");
contentResolver.update(uri, values, null, null);
Log.i("数据更新","数据出更新成功!!!");
}*/
public void testQue()
{
ContentResolver contentResolver=getContext().getContentResolver();
/*//获得URI单条记录
Uri uri=Uri.parse("content://com.yqq.mycontentprovider2.db.StudentProvider/student/7");
//获得URI多条条记录
Uri uri=Uri.parse("content://com.yqq.mycontentprovider2.db.StudentProvider/student");
*/
/*
Cursor cursor=contentResolver.query(uri, null, null, null, null);
int colums=cursor.getColumnCount();
Map
while(cursor.moveToNext())
{
for(int i=0;i
{
String columName=cursor.getColumnName(i);
String columValue=cursor.getString(cursor.getColumnIndex(columName));
if(columValue==null)
{
columValue=" ";
}
map.put(columName, columValue);
}
}
Log.i("数据查找",map.toString());
*/
///////////////////////////////////////////////////
//多条记录查询
//获得URI多条条记录
Uri uri=Uri.parse("content://com.yqq.mycontentprovider2.db.StudentProvider/student");
Cursor cursor=contentResolver.query(uri, null, null, null, null);
int colums=cursor.getColumnCount();
List
while(cursor.moveToNext())
{
Map
for(int i=0;i { String columName=cursor.getColumnName(i); String columValue=cursor.getString(cursor.getColumnIndex(columName)); if(columValue==null) { columValue=" "; } map.put(columName, columValue); } list.add(map); } Log.i("数据查找",list.toString()); } }