android使用 ContentProvider.docx
- 文档编号:11547057
- 上传时间:2023-03-19
- 格式:DOCX
- 页数:16
- 大小:20.90KB
android使用 ContentProvider.docx
《android使用 ContentProvider.docx》由会员分享,可在线阅读,更多相关《android使用 ContentProvider.docx(16页珍藏版)》请在冰豆网上搜索。
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"/>
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- android使用 ContentProvider android 使用