android:
authorities="com.spl.myprovider"
android:
name="spl.db.contentprovider.MyProvider"/>
为了能让其他应用找到该ContentProvider,ContentProvider采用了authorities(主机名/域名)对它进行唯一标识,你可以把ContentProvider看作是一个网站,authorities就是他的域名。
URI介绍
ContentProvider通过URI来共享数据。
URI是一个通用资源标识符,它的构成如图6-1所示:
图6-1URI的组成
从上图可见,一般URI由4部分构成:
1)sheme:
无法改变的标准前缀
2)主机名或authority:
ContentProvider的唯一标示,在Manifes中声明
3)路径:
可以理解为要操作的数据中表的名字
4)ID:
需要获取的记录的ID,如果没有则表示返回全部记录
UriMatcher
Android系统提供了UriMatcher类来对URI进行匹配。
使用步骤如下:
1)首先创建UriMatcher类
2)然后通过addURI方法增加需要匹配的路径,并给每个路径标记一个匹配码
3)最后通过match方法进行匹配,返回匹配码
代码片段如下:
privatestaticUriMatchermatcher=newUriMatcher(UriMatcher.NO_MATCH);
privatestaticfinalintCONTACTS=1;//匹配码1
privatestaticfinalintCONTACT=2;//匹配码2
privatestaticfinalStringTABLENAME="person";
static{
matcher.addURI("com.spl.myprovider","person",CONTACTS);
matcher.addURI("com.spl.myprovider","person/#",CONTACT);
}
@Override
publicintdelete(Uriuri,Stringselection,String[]selectionArgs){
switch(matcher.match(uri)){
caseCONTACTS:
//执行相应操作
caseCONTACT:
//执行相应操作
default:
thrownewIllegalArgumentException("URI"+uri+"无法解析!
");
}
}
上面代码中出现的“#”为通配符,代表任意数字,另外还可以使用通配符“*”来代表任意文本。
ContentResolver介绍
其他应用程序要想访问ContentProvider中的数据,就需要通过ContentResolver对象。
ContantResolver提供的方法和ContentProvider相对应,也有增删改查这4个方法。
每个Activity都有一个ContentResolver对象,可以通过getContentResolver方法获取到。
下面的实例展示了如何使用ContentProvider共享数据,以及如何让其他应用获取到ContentProvider中的数据。
该实例有两个应用组成:
第1个应用SQLiteDemo本质上是一个数据库应用,它维护一个数据表person,并通过MyProvider类对外共享了这张表的数据;第2个应用ContentResolverDemo只包含一个Activity,通过ContentResolver来访问person表中的数据。
SQLiteDemo中的MyProvider.java的代码如下:
packagespl.db.contentprovider;
importspl.db.DBHelper;
importandroid.content.ContentProvider;
importandroid.content.ContentUris;
importandroid.content.ContentValues;
importandroid.database.Cursor;
importandroid.database.sqlite.SQLiteDatabase;
import.Uri;
importandroid.content.UriMatcher;
publicclassMyProviderextendsContentProvider{
privateDBHelperhelper;
privatestaticUriMatchermatcher=newUriMatcher(UriMatcher.NO_MATCH);
privatestaticfinalintCONTACTS=1;//匹配码1
privatestaticfinalintCONTACT=2;//匹配码2
privatestaticfinalStringTABLENAME="person";
static{
matcher.addURI("com.spl.myprovider","person",CONTACTS);
matcher.addURI("com.spl.myprovider","person/#",CONTACT);
}
@Override
publicbooleanonCreate(){
helper=newDBHelper(getContext());
returntrue;
}
@Override
publicUriinsert(Uriuri,ContentValuesvalues){
SQLiteDatabasesqLiteDatabase=helper.getWritableDatabase();
switch(matcher.match(uri)){
caseCONTACTS:
longid=sqLiteDatabase.insert(TABLENAME,"name",values);
UriinsertUri=ContentUris.withAppendedId(uri,id);
returninsertUri;
default:
thrownewIllegalArgumentException("URI"+uri+"无法解析!
");
}
}
@Override
publicintdelete(Uriuri,Stringselection,String[]selectionArgs){
SQLiteDatabasesqLiteDatabase=helper.getWritableDatabase();
introwNum=0;
switch(matcher.match(uri)){
caseCONTACTS:
rowNum=sqLiteDatabase.delete(TABLENAME,selection,selectionArgs);
returnrowNum;
caseCONTACT:
longid=ContentUris.parseId(uri);
StringwhereClause="_id="+id;
if(selection!
=null){
whereClause+="and"+selection;
}
rowNum=sqLiteDatabase.delete(TABLENAME,whereClause,selectionArgs);
returnrowNum;
default:
thrownewIllegalArgumentException("URI"+uri+"无法解析!
");
}
}
@Override
publicintupdate(Uriuri,ContentValuesvalues,Stringselection,
String[]selectionArgs){
SQLiteDatabasesqLiteDatabase=helper.getWritableDatabase();
introwNum=0;
switch(matcher.match(uri)){
caseCONTACTS:
rowNum=sqLiteDatabase.update(TABLENAME,values,selection,selectionArgs);
returnrowNum;
caseCONTACT:
longid=ContentUris.parseId(uri);
StringwhereClause="_id="+id;
if(selection!
=null){
whereClause+="and"+selection;
}
rowNum=sqLiteDatabase.update(TABLENAME,values,whereClause,selectionArgs);
returnrowNum;
default:
thrownewIllegalArgumentException("URI"+uri+"无法解析!
");
}
}
@Override
publicCursorquery(Uriuri,String[]projection,Stringselection,
String[]selectionArgs,StringsortOrder){
SQLiteDatabasedb=helper.getReadableDatabase();
switch(matcher.match(uri)){
caseCONTACTS:
returndb.query(TABLENAME,projection,selection,selectionArgs,null,null,sortOrder);
caseCONTACT:
longid=ContentUris.parseId(uri);
StringwhereClause="_id="+id;
if(selection!
=null){
whereClause+="and"+selection;
}
returndb.query(TABLENAME,projection,whereClause,selectionArgs,null,null,sortOrder);
default:
thrownewIllegalArgumentException("URI"+uri+"无法解析!
");
}
}
@Override
publicStringgetType(Uriuri){
switch(matcher.match(uri)){
caseCONTACTS:
return"vnd.android.cursor.dir/person";
caseCONTACT:
return"vnd.android.cursor.item/person";
default:
thrownewIllegalArgumentException("URI"+uri+"无法解析!
");
}
}
}
SQLiteDemo中的DBHelper.java的代码如下:
packagespl.db;
importandroid.content.Context;
importandroid.database.sqlite.SQLiteDatabase;
importandroid.database.sqlite.SQLiteOpenHelper;
publicclassDBHelperextendsSQLiteOpenHelper{
privatestaticfinalStringDATABASE_NAME="contactinfo.db";
privatestaticfinalintVERSION=1;
publicDBHelper(Contextcontext){
super(context,DATABASE_NAME,null,VERSION);
//TODOAuto-generatedconstructorstub
}
@Override
publicvoidonCreate(SQLiteDatabasedb){
//TODOAuto-generatedmethodstub
db.execSQL("CREATETABLEperson(_idINTEGERPRIMARYKEYautoincrement,namevarchar(20),ageINTEGER)");
}
@Override
publicvoidonUpgrade(SQLiteDatabasedb,intoldVersion,intnewVersion){
//TODOAuto-generatedmethodstub
}
}
SQLiteDemo的Manifest文件中有关Provider注册的代码如下:
android:
authorities="com.spl.myprovider"
android:
name="spl.db.contentprovider.MyProvider"/>
ContentResolverDemo中的主Activity代码如下
package.jbit.activity;
importandroid.app.Activity;
importandroid.content.ContentResolver;
importandroid.content.ContentUris;
importandroid.content.ContentValues;
importandroid.database.Cursor;
import.Uri;
importandroid.os.Bundle;
importandroid.view.View;
importandroid.widget.ListView;
importandroid.widget.SimpleCursorAdapter;
publicclassResolverActivityextendsActivity{
/**Calledwhentheactivityisfirstcreated.*/
@Override
publicvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
publicvoidBtnOnClick(Viewview){
ContentResolverresolver=this.getContentResolver();
Uriuri=Uri.parse("content:
//com.spl.myprovider/person");
switch(view.getId()){
//增加一条记录
caseR.id.button1:
{
ContentValuesvalues=newContentValues();
values.put("name","lilei");
values.put("age","13");
resolver.insert(uri,values);
break;
}
//删除一条记录
caseR.id.button2:
{
UrideleteIdUri=ContentUris.withAppendedId(uri,11);
resolver.delete(deleteIdUri,null,null);
break;
}
//修改一条记录
caseR.id.button3:
{
ContentValuesvalues=newContentValues();
values.put("name","wanggang");
UriupdateUri=ContentUris.withAppendedId(uri,5);
resolver.update(updateUri,values,null,null);
break;
}
//查询并显示所有记录
caseR.id.button4:
{
Cursorcursor=resolver.query(uri,null,null,null,null);
SimpleCursorAdapteradapter=newSimpleCursorAdapter(
this,
R.layout.dataview_layout,
cursor,
newString[]{"_id","name","age"},
newint[]{R.id.contact_id,R.id.contact_name,R.id.contact_age});
ListViewlistView=(ListView)findViewById(R.id.listView1);
listView.setAdapter(adapter);
break;
}
}
}
}
ContentResolverDemo中的main.xml代码如下
xmlversion="1.0"encoding="utf-8"?
>
android="
android:
orientation="vertical"
android:
layout_width="fill_parent"
android:
layout_height="fill_parent"
android:
background="#9e9e9e">