android使用 ContentProvider.docx

上传人:b****5 文档编号:11547057 上传时间:2023-03-19 格式:DOCX 页数:16 大小:20.90KB
下载 相关 举报
android使用 ContentProvider.docx_第1页
第1页 / 共16页
android使用 ContentProvider.docx_第2页
第2页 / 共16页
android使用 ContentProvider.docx_第3页
第3页 / 共16页
android使用 ContentProvider.docx_第4页
第4页 / 共16页
android使用 ContentProvider.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

android使用 ContentProvider.docx

《android使用 ContentProvider.docx》由会员分享,可在线阅读,更多相关《android使用 ContentProvider.docx(16页珍藏版)》请在冰豆网上搜索。

android使用 ContentProvider.docx

android使用ContentProvider

使用ContentProvider共享数据

1.统一的数据访问方式

当应用继承ContentProvider类,并重写该类用于提供数据和存储数据的方法,就可以向其他应用共享其数据。

文件的操作模式中,通过指定文件的操作模式为Context.MODE_WORLD_READABLE或Context.MODE_WORLD_WRITEABLE同样可以对外共享数据,

但数据的访问方式会因数据存储的方式而不同,如:

采用xml文件对外共享数据,需要进行xml解析来读写数据;

采用sharedpreferences共享数据,需要使用sharedpreferencesAPI读写数据。

而使用ContentProvider共享数据的好处是统一了数据访问方式。

通俗一点,例如我要访问另一个应用怎么来描述我的需求呢?

有种方式可向Webservice那样,统一一种描述语言,大家靠这个来互相理解。

但是太麻烦了。

现在的情况远远好于应用Webservice的场景,因为,应用们都在一部手机上,大家都归Android操作系统老大管。

于是好办!

甲应用说中文,说:

我想得到联系人“13999999”的详细信息。

乙应用来做大洋彼岸,说:

Iwanttogetcontacts,"13999999r"formoreinformation.

丁说ri语,高呼呀嘛蝶。

这是在要求访问“通讯录”应用啊,是属于另一个应用了,在另一个进程里。

难道我做一个“通信录”程序,为了要让别人访问我,我还得提供“中文”、“英文”、“ri文”三种访问模式?

这没法搞了,于是由Android牵头,大家商议统一描述语言,于是弄出个Uri。

那么以后这种需求Android规定,大家统一说一样的语言:

content:

//com.android.contacts/data/phones/filter/13999999

“通讯录”程序中需要提供一种对指定模式的Uri的解析机制,并且这种解析机制要注册在操作系统中,随时工作。

例如,只要解析到了“data/phones/filter/13999999”这种模式,它立马截取出“13999999”然后再自己的持久化库中去找寻详细信息,再返回回去。

2.继承ContentProviter

publicclassPersonContentProviderextendsContentProvider;

和Activity一样,ContentProviter属于Android的一种组件

3.注册内容提供者

AndroidManifest.xml

name=".PersonContentProvider"

android:

authorities="wjh.android.provider.personprovider"/>

android:

name:

指向内容提供者的类

android:

authorities:

应用中的一个唯一的字符串标识。

可以将它看作域名。

在本应用或其它应用中,可以通过这个域名来访问内容提供者。

4.ContentProvider中的方法

/**

*其它应用可以通过此方法对内容提供者删除数据

*/

publicintdelete(Uriuri,Stringselection,String[]selectionArgs){

return0;

}

/**

*其它应用可以通过此方法对内容提供者添加数据

*/

publicUriinsert(Uriuri,ContentValuescontentValues)

/**

*其它应用可以通过此方法对内容提供者查询数据

*/

publicCursorquery(Uriuri,String[]arg1,Stringarg2,String[]arg3,

Stringarg4)

/**

*其它应用可以通过此方法对内容提供者更新数据

*/

publicintupdate(Uriarg0,ContentValuesarg1,Stringarg2,String[]arg3)

/**

*内容类型

*/

publicStringgetType(Uriuri):

该方法用于返回当前Url所代表数据的MIME类型。

如果操作的数据属于集合类型,

那么MIME类型字符串应该以vnd.android.cursor.dir/开头,例如:

要得到所有person记录的Uri为content:

//cn.itcast.provider.personprovider/person,那么返回的MIME类型字符串应该为:

“vnd.android.cursor.dir/person”。

如果要操作的数据属于非集合类型数据,那么MIME类型字符串应该以vnd.android.cursor.item/开头,例如:

得到id为10的person记录,Uri为content:

//cn.itcast.provider.personprovider/person/10,

那么返回的MIME类型字符串应该为:

“vnd.android.cursor.item/person”。

5.URI

Uri代表了要操作的数据,Uri主要包含了两部分信息:

1.需要操作的ContentProvider

2.对ContentProvider中的什么数据进行操作,

一个Uri由以下几部分组成

scheme-->content:

//(此scheme仅表示内容提供者的scheme)

主机名或Authority-->wjh.android.provider.personprovider

路径-->person/10/name

组合成一个完整的Uri为:

content:

//wjh.android.provider.personprovider/person/10/name

路径虽然可以随便定义,但为了方便其它人理解,应该遵循一定的命名规则:

要操作person表中id为10的记录,可以构建这样的路径:

/person/10

要操作person表中id为10的记录的name字段,person/10/name

要操作person表中的所有记录,可以构建这样的路径:

/person

要操作xxx表中的记录,可以构建这样的路径:

/xxx

当然要操作的数据不一定来自数据库,也可以是文件、xml或网络等其他存储方式,如下:

要操作xml文件中person节点下的name节点,可以构建这样的路径:

/person/name

将字符串转换成Uri,可以使用Uri类中的parse()方法,如下:

Uriuri=Uri.parse("content:

//cn.itcast.provider.personprovider/person")

UriMatcher:

用于Uri匹配

UriMatcher.addURI:

添加一个Uri匹配模式

UriMatcher,match:

匹配Uri,返回Boolean。

ContentUris:

用于对uri进行字符操作

ContentUris.withAppendedId(uri,append):

给uri添加一个ID

ContentUris.parseId:

从Uri中解析出ID

6.ContentResolver:

用于操作ContentProvider

当外部应用需要对ContentProvider中的数据进行添加、删除、修改和查询操作时,可以使用ContentResolver类来完成,

要获取ContentResolver对象,可以使用Activity提供的getContentResolver()方法。

ContentResolver类提供了与ContentProvider类相同签名的四个方法:

该方法用于往ContentProvider添加数据:

publicUriinsert(Uriuri,ContentValuesvalues)

该方法用于从ContentProvider删除数据:

publicintdelete(Uriuri,Stringselection,String[]selectionArgs)

该方法用于更新ContentProvider中的数据。

publicintupdate(Uriuri,ContentValuesvalues,Stringselection,String[]selectionArgs)

该方法用于从ContentProvider中获取数据。

publicCursorquery(Uriuri,String[]projection,Stringselection,String[]selectionArgs,StringsortOrder)

这些方法的第一个参数为Uri,

代表要操作的ContentProvider和对其中的什么数据进行操作,

假设给定的是:

Uri.parse(“content:

//cn.itcast.providers.personprovider/person/10”),

那么将会对主机名为cn.itcast.providers.personprovider的ContentProvider进行操作,

操作的数据为person表中id为10的记录。

其中主机名是要访问的应用在AndroidManifest.xml所注册的provider的authorities属性

7.代码示例:

应用一:

内容提供者所在的应用

1,AndroidManifest.xml

xmlversion="1.0"encoding="utf-8"?

>

android="

package="wjh.android.db"android:

versionCode="1"android:

versionName="1.0">

icon="@drawable/icon"android:

label="@string/app_name">

name="android.test.runner"/>

name=".MainActivity"android:

label="@string/app_name">

name="android.intent.action.MAIN"/>

name="android.intent.category.LAUNCHER"/>

name=".PersonContentProvider"

--注册内容提供者-->

android:

authorities="wjh.android.provider.personprovider"/>

minSdkVersion="8"/>

2.准备:

数据库(这只是内容提供者的一种形式,还可以是操作文件,如XML等等)

publicclassDBOpenHandlerextendsSQLiteOpenHelper{

/**

*@paramcontext当前应用上下文

*/

publicDBOpenHandler(Contextcontext){

super(context,"myAndroid.db",null,2);

}

@Override

publicvoidonCreate(SQLiteDatabasedb){

Stringsql_createTable="CREATETABLEperson(personidintegerprimarykeyautoincrement,name)";

db.execSQL(sql_createTable);

}

@Override

publicvoidonUpgrade(SQLiteDatabasedb,intoldVersion,intnewVersion){

Stringsql="ALTERTABLEpersonADDphone";

db.execSQL(sql);

db.execSQL("ALTERTABLEpersonADDamountinteger");

}

}

3.TContentProvider

/**

*内容提供者

*/

publicclassPersonContentProviderextendsContentProvider{

privatestaticfinalUriMatcherMATCHER=newUriMatcher(UriMatcher.NO_MATCH);

privatestaticfinalintPERSONS=1;

privatestaticfinalintPERSON=2;

privateDBOpenHandlerdbOpenHandler;

//静态初始化Uri匹配模式

static{

//content:

//wjh.android.provider.personprovider/person:

表示对person表所有数据进行操作

MATCHER.addURI("wjh.android.provider.personprovider","person",PERSONS);

//content:

//wjh.android.provider.personprovider/person/3:

表示对Perosn表Id为3的单体记录进行操作

MATCHER.addURI("wjh.android.provider.personprovider","person/#",PERSON);

}

/**

*其它应用可以通过此方法对内容提供者删除数据

*/

publicintdelete(Uriuri,Stringselection,String[]selectionArgs){

SQLiteDatabasedb=dbOpenHandler.getWritableDatabase();

intnum=0;

switch(MATCHER.match(uri)){

casePERSONS:

num=db.delete("person",selection,selectionArgs);

break;

casePERSON:

longid=ContentUris.parseId(uri);

Stringwhere="personid="+id;

if(selection!

=null&&!

"".equals(selection)){

where=where+"and"+selection;

}

num=db.delete("person",where,selectionArgs);

break;

default:

thrownewIllegalArgumentException("UnkownUri:

"+uri);

}

returnnum;

}

/**

*获取内容提供者内容的类型

*/

@Override

publicStringgetType(Uriuri){

SQLiteDatabasedb=dbOpenHandler.getWritableDatabase();

switch(MATCHER.match(uri)){

casePERSONS:

//vnd.android.cursor.dir:

集合类型

return"vnd.android.cursor.dir/person";

casePERSON:

//vnd.android.cursor.item:

单条记录

return"vnd.android.cursor.item/person";

default:

thrownewIllegalArgumentException("UnkownUri:

"+uri);

}

}

/**

*其它应用可以通过此方法对内容提供者添加数据

*/

publicUriinsert(Uriuri,ContentValuescontentValues){

SQLiteDatabasedb=dbOpenHandler.getWritableDatabase();

switch(MATCHER.match(uri)){

casePERSONS:

longrowid=db.insert("person","name",contentValues);

returnContentUris.withAppendedId(uri,rowid);

default:

thrownewIllegalArgumentException("UnkownUri:

"+uri);

}

}

publicbooleanonCreate(){

dbOpenHandler=newDBOpenHandler(getContext());

returntrue;

}

/**

*其它应用可以通过此方法对内容提供者查询数据

*/

publicCursorquery(Uriuri,String[]projection,Stringselection,String[]selectionArgs,

StringsortOrder){

SQLiteDatabasedb=dbOpenHandler.getWritableDatabase();

switch(MATCHER.match(uri)){

casePERSONS:

returndb.query("person",projection,selection,selectionArgs,null,null,sortOrder);

casePERSON:

longid=ContentUris.parseId(uri);

Stringwhere="personid="+id;

if(selection!

=null&&!

"".equals(selection)){

where=where+"and"+selection;

}

returndb.query("person",projection,where,selectionArgs,null,null,sortOrder);

default:

thrownewIllegalArgumentException("UnkownUri:

"+uri);

}

}

/**

*其它应用可以通过此方法对内容提供者更新数据

*/

publicintupdate(Uriuri,ContentValuesvalues,Stringselection,String[]selectionArgs){

SQLiteDatabasedb=dbOpenHandler.getWritableDatabase();

intnum=0;

switch(MATCHER.match(uri)){

casePERSONS:

num=db.update("person",values,selection,selectionArgs);

break;

casePERSON:

longid=ContentUris.parseId(uri);

Stringwhere="personid="+id;

if(selection!

=null&&!

"".equals(selection)){

where=where+"and"+selection;

}

num=db.update("person",values,where,selectionArgs);

break;

default:

thrownewIllegalArgumentException("UnkownUri:

"+uri);

}

returnnum;

}

}

应用二:

用于测试访问应用一的内容提供者

1,AndroidManifest.xml

xmlversion="1.0"encoding="utf-8"?

>

android="

package="wjh.android.other"

android:

versionCode="1"

android:

versionName="1.0">

icon="@drawable/icon"android:

label="@string/app_name">

name="android.test.runner"/>

name=".OtherActivity"

android:

label="@string/app_name">

name="android.intent.action.MAIN"/>

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 院校资料

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1