ContentResolver用法
- ContentProvider 中提供了一系列的方法用于对数据进行增删改查操作:
insert()
、update()
、delete()
、query()
等,这些用法跟SQLiteDatabase中的增删改查几个方法用法类似,只是参数不同。
步骤
- 一 获取ContentProvider的实例:可以通过Context中的getContentProvider()方法来获取:
ContentProvider contentProvider=context.getContentResolver();
二 进行CRUD操作:
添加数据insert():
ContentValues values=new ContentValues(); values.put("column1","text1"); values.put("column2","text2"); contenteProvider.insert(uri,values);//SQLiteDatabase的insert()和ContentProvider的insert()区别就在于,两者的第一个参数不同,前者第一个参数传入的是表名,后者传入的是uri数据
删除数据delete():
contentProvider.delete(uri,"column2=?",new String[]{"text2"});//参数除了第一个之外跟SQLiteDatabase都一样,用法也一样~~~第一个参数用意也一样,都是用来找到需要操作的表,只不过数据类型不一样
更新数据update():
ContentValues values=new ContentValues();//第一步先构造出包含待更新内容的ContentValues values.put("column1","text2"); contentProvider.update(uri,values,"column1=?",new String[]{"text"});//这里第三、第四个参数是用来约束更新的行,符合条件就更新。
查询数据query():
Cursor cursor=contentProvider.query();//query()返回的是一个Cursor(游标)对象,要通过这个对象来逐行读取查询到的数据 if(cursor!=null/*不为空说明查询结果不为空*/) { while(cursor.moveToNext()) { String column1=cursor.getString(cursor.getColumnIndex("column1")); int column2=cursor.getInt(cursor.getColumnIndex("column2")); } cursor.close(); }
关于Uri:
ContentProvider中CRUD四个方法的第一个参数,都是uri,这个参数成为内容URI,内容URI给ContentProvider中的数据建立唯一的标识符,根据这个标识符才能找到对应的表来操作。
Uri结构:协议+权限(authority)+路径(path),其中协议部分为content://,authority部分一般采用程序包名(比如
com.example.app
)的方式来进行命名,path部分即要操作的表名。Uri标准格式:
content://com.example.app.provider/table1 content://com.example.app.provider/table2
将String格式字符串解析成Uri对象:调用Uri的Parse()方法
Uri uri=Uri.Parse("content://com.example.app.privider/table1");
创建ContentProvider
- 要想实现夸程序共享数据的功能,官方推荐使用ContentProvider
步骤
- 一 新建MyProvider类继承自ContentProvider,重写ContentProvider类的留个方法:
public class MyProvider extends ContentProvider
{
/*
*初始化ContentProvider的时候调用
*应该在这个方法中完成数据库的创建和升级等操作
*只有当存在ContentResolver尝试访问程序中的数据库时,ContentProvider才会被初始化
*/
@override
public boolean onCreate()
{
return false;
}
/*
*从ContentProvider中查询数据
*uri用来确定查询那张表
*projection参数用于确定查询的列
*selection和selectionArgs用于条件约束
*/
@override
public Cursor query(Uri uri,String[] projection,String selection,String[] selectionArgs,String sortOrder)
{
return null;
}
/*
*向ContentProvider中插入数据
*/
@override
public Uri insert(Uri uri,ContentValues values)
{
return null;
}
/*
*更新ContentProvider中的已有数据
*selection和selectionArgs用于条件约束
*/
@override
public int update(Uri uri,ContentValues values,String selection,String[] selectionArgs)
{
return 0;
}
/*
*删除CotentProvider中的数据
*/
@override
public int delete (Uri uri,String selection,String[] selectionArgs)
{
return 0;
}
/*
*根据传入的uri来返回相应的MIME类型
*/
@override
public String getType(Uri uri)
{
return null;
}
}
- 二 在MyContentProvider中解析传入的Uri参数:Uri格式:
content://com.example.app.provider/table1
content://com.example.app.provider/table2 //表示要访问的是com.example.app这个应用的table1、2表中的数据/*这种以路径结尾的uri表示期望访问该表中所有的数据*/
content://com.example.app.provider/table1/1 //表示要访问的是table1中id为1的数据/*这种以id结尾的uri表示期望访问该表中拥有相应id的数据*/
content://com.example.app.provider/* //该uri表示匹配com.example.app应用中任意表的内容
content://com.example.app.provider/table1/# //该uri表示匹配table1表中的任意一行数据
- 借助UriMatcher类来实现匹配URI的功能: 创建一个UriMatcher对象,调用UriMatcher的addURI()方法添加待匹配的uri,最后调用match()方法将传入的uri和待匹配uri进行匹配,并根据匹配结果进行逻辑处理:
public class MyProvider extends ContentProvider
{
......
public static final int TABLE1_DIR=0;
public static final int TABLE1_ITEM=1;
public static final int TABLE2_DIR=2;
public static final int TABLE2_ITEM=3;
private static UriMatcher uriMatcher;
static
{
uriMatcher=new UriMatcher(UriMatcher.NO_MATCH);
uriMatcher.addURI("com.example.app.provider","table1",TABLE1_DIR);//第一个参数为uri的权限部分(com.example.app.provider),第二个参数为uri的路径部分(table1),第三个参数为自定义代码,用于接收match()方法返回的int数值进行后面的逻辑处理
uriMatcher.addURI("com.example.app.provider","table1/#",TABLE1_ITEM);
uriMatcher.addURI("com.example.app.provider","table2",TABLE2_DIR);
uriMatcher.addURI("com.example.app.provider","table2/#",TABLE2_ITEM);
}
@override
public Cursor query(Uri uri,String[] projection,String selection,String[] selectionArgs,String sortOrder)
{
switch(uriMatcher.match(uri))
{
case TABLE1_DIR:
//查询table1中的所有数据
break;
case TABLE1_ITEM:
//查询table1表中的单条数据
break;
case TABLE2_DIR:
//查询table2中的所有数据
break;
case TABLE2_ITEM:
//查询table2表中的单条数据
break;
}
return null;
}
......
}
在getType()方法中获取Uri对象所对应的MIME类型:一个URI所对应的MIME字符串主要有三部分组成,这三部分有以下格式规定:
- 1.必须以vnd开头;
- 2.如果内容URI以路径结尾,则后接android.cursor.dir/,如果内容URI以id结尾,则后接android.cursor.item/;
- 3.最后接上vnd..。
例如,对于content://com.example.app.provider/table1
这个uri,对应的MIME类型:
vnd.android.cursor.dir/vnd.com.example.app.provider.table1
对于content://com.example.app.provider/table1/1
这个uri,对应的MIME类型:
vnd.android.cursor.item/vnd.com.example.app.provider.table1
例:
@override
public Cursor query(Uri uri,String[] projection,String selection,String[] selectionArgs,String sortOrder)
{
switch(uriMatcher.match(uri))
{
case TABLE1_DIR:
//查询table1中的所有数据
return "vnd.android.cursor.dir/vnd.com.exalmple.app.provider.table1";
case TABLE1_ITEM:
//查询table1表中的单条数据
return "vnd.android.cursor.item/vnd.example.app.provider.table1";
case TABLE2_DIR:
//查询table2中的所有数据
return "vnd.android.cursor.dir/vnd.example.app.provider.table2";
case TABLE2_ITEM:
//查询table2表中的单条数据
return "vnd.android.cursor.item/vnd.com.example.app.provider.table2";
default:
break;
}
return null;
}
20151126 10:18 By Xiong