Android内容提供者源码
16lz
2022-01-14
- Android内容提供者源码,我不想说多,只讲一些实用的代码,增删改查。通过contentProvider向数据进行操作。大家可以下载,通过日志与LogCat打印出来的信息作为参考!
- packagecom.smart;
- importandroid.app.Activity;
- importandroid.content.ContentResolver;
- importandroid.content.ContentValues;
- importandroid.database.Cursor;
- importandroid.net.Uri;
- importandroid.os.Bundle;
- importandroid.provider.ContactsContract;
- importandroid.util.Log;
- publicclassContentProviderextendsActivity{
- privatestaticfinalStringTAG="ContentProvider";
- @Override
- publicvoidonCreate(BundlesavedInstanceState){
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- //通过这个类,方问DB项目
- ContentResolvercontentResolver=this.getContentResolver();
- Urialluri=Uri.parse("content://com.smart.provider.personprovider/person");
- //Uriuri=Uri.parse("content://com.smart.provider.personprovider/person");
- ContentValuesvalues=newContentValues();
- values.put("name","smart99");//这里更改就可以了。/
- values.put("age",(short)44);
- //contentResolver.insert(uri,values);//增加
- Uriuri=Uri.parse("content://com.smart.provider.personprovider/person/5");
- //contentResolver.update(uri,values,null,null);//更新
- //contentResolver.delete(uri,null,null);//删除
- //查询
- //Cursorcursor=contentResolver.query(uri,newString[]{
- //"personid","name","age"},null,null,"personiddesc");
- //while(cursor.moveToNext()){
- //Log.i(TAG,
- //"personid="+cursor.getInt(0)+",name="
- //+cursor.getString(1)+",age="
- //+cursor.getShort(2));
- //}
- //cursor.close();
- //记得要关掉数据
- //01:19
- contactMethod();
- }
- //读取通迅里的人员。
- publicvoidcontactMethod(){
- //联系人,/媒体库/
- ContentResolvercontentResolver=this.getContentResolver();
- Cursorcursor=contentResolver.query(ContactsContract.Contacts.CONTENT_URI,null,null,null,null);
- while(cursor.moveToNext()){
- intcontactId=cursor.getInt(cursor.getColumnIndex(ContactsContract.Contacts._ID));
- Stringname=cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
- Log.i(TAG,"contactId="+contactId+",name="
- +name);
- Cursorphones=getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
- null,ContactsContract.CommonDataKinds.Phone.CONTACT_ID+"="+contactId,null,null);
- StringBuffersb=newStringBuffer();
- while(phones.moveToNext()){
- StringphoneNumber=phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
- sb.append(phoneNumber).append(",");
- }
- //电话号码可以得到
- Log.i(TAG,sb.toString());
- }
- cursor.close();
- }
- }
- packagecom.smart.dh;
- importandroid.content.ContentProvider;
- importandroid.content.ContentUris;
- importandroid.content.ContentValues;
- importandroid.content.UriMatcher;
- importandroid.database.Cursor;
- importandroid.database.sqlite.SQLiteDatabase;
- importandroid.net.Uri;
- importandroid.text.TextUtils;
- importcom.smart.service.DataBaseOpenHelper;
- /**
- *使用内容提供者
- ContentProvider共享数据
- 当应用继承ContentProvider类,并重写该类用于提供数据和存储数据的方法
- 就可以向其它应用共享其数据。虽然使用其它方法对外共享数据,但是数据访问
- 方式会因数据存储的方式而不同。,而采用文件操作读写数据,采用sharedoreferences共享数据的需要使用sharedpreferencesAPI读写数据,而使用ContentProvider共享数据的好处
- 好处是统一了数据访问方式,当应用需要通过ContentProvider对外共享数据时,第一步需要继承ContentProvider并重写下面的方法。
- PublicclassPersonContentProviderextendsContentProvider{
- PublicbooleanonCreate();
- PublicUriinsert(Uriuri,ContentValuesvalues);
- Publicintdelete(Uriuri,Stringselection,String[]selectionArgs);
- Publicintupdate(Uriuri,ContentValuesvalues,Stringselection,StringselectionArgs);
- PullicCursorquery(Uriuri,String[]projection,Stringselection,String[]selectionArgs,StringsoftOrder);
- PublicStringgetType(Uriuri);
- }
- 第二步需要在AndroidMandifest.xml使用<provider>对该ContentProvider进行配置,为了能让其它应用找到该ContentProvider,ContentProvider采用了authorites(主机名、域名)对它进行唯一标识,你可以把ContentProvider看作是一个网站(想想,网站也是提供数据者),authorites就是他的域名:
- 下面是在要注册信息
- <appli…>
- <providerandroid:name=”.类名”android:authorities=”con.smart.provider.包名”>
- </appli>
- 注意:一旦应用继承了ContentProvider类,后面我们就会把这个应用称为ContentProvider内容提供者
- *ContentProvider来自于文件与数据库都可以
- *
- *Uri介绍
- *Uri代表了要操作的数据,Uri主要包含了两部信息:1》
- *需要操作的ContentProvider,2>
- *对ContentProvider中的,什么数据进行操作,一个Uri由以下几个部分组成。
- *content://com.smart.provider.personperovider/person/988
- *content://指scheme
- *om.smart.provider.personperovider指主机名或authority
- *person指路径
- *988指ID
- **/
- publicclassPersonContentProviderextendsContentProvider{
- //另一个工程,方问这一个类。
- privateDataBaseOpenHelperdbOpenHelper;
- privatestaticfinalintALLPERSON=1;
- privatestaticfinalintPERSON=2;
- privatestaticUriMatchersMatcher=newUriMatcher(UriMatcher.NO_MATCH);//任何不匹配的时候,返回为-1
- static{
- //
- sMatcher.addURI("com.smart.provider.personprovider","person",ALLPERSON);
- sMatcher.addURI("com.smart.provider.personprovider","person/#",PERSON);
- }
- //删除
- @Override
- publicintdelete(Uriuri,Stringselection,String[]selectionArgs){
- SQLiteDatabasedb=dbOpenHelper.getWritableDatabase();
- intcount=0;//返回的行数
- switch(sMatcher.match(uri)){
- caseALLPERSON:
- count=db.delete("person",selection,selectionArgs);
- break;
- casePERSON:
- longpersonid=ContentUris.parseId(uri);
- Stringwhere=TextUtils.isEmpty(selection)?"personid=?"
- :selection+"andpersonid=?";
- String[]params=newString[]{String.valueOf(personid)};
- if(!TextUtils.isEmpty(selection)&&selectionArgs!=null){
- params=newString[selectionArgs.length+1];
- for(inti=0;i<selectionArgs.length;i++){
- params[i]=selectionArgs[i];
- }
- params[selectionArgs.length+1]=String.valueOf(personid);
- }
- count=db.delete("person",where,params);
- break;
- default:
- thrownewIllegalArgumentException("UnkowUri:"+uri);
- }
- returncount;
- }
- /**
- *publicStringgetType(Uriuri)
- *方法用于返回URI所代表数据的MIME类型,如果操作的数据发球集合类型,哪么MIME类型
- *字符串应该以vnd.android.cursor.dir/开头,要得到所有的person记录Uri为,
- *ontent//com.smart.domain/person哪么返回MIME类型字符串应该为,
- *vnd.android.cursor.item/开头,比如,得到的ID为1的person记录,URI为
- *ontent//com.smart.domain/person/10,哪么返回的MIME类型字符串应该为
- *vnd.android.cursor.item/person
- **/
- //操作数据类型
- @Override//这个方法,不实现也可以的。
- publicStringgetType(Uriuri){
- switch(sMatcher.match(uri)){
- caseALLPERSON:
- //多条
- return"vnd.android.cursor.dir/personprovider.person";
- casePERSON:
- //personprovider.person内容提供表的
- //单条
- return"vnd.android.cursor.item/personprovider.person";
- default:
- thrownewIllegalArgumentException("UnkowUri:"+uri);
- }
- }
- /**
- *UriMatcher类的使用介绍因为URI代表了要操作的数据,所以我们很经常需要解析URI,并从URI中获得取数据,ANDROID系统
- *提供了两个用于操作URI的工具类,分别为URIMATCHER和CONTENTURIS。掌握它们的使用,会便于我们的开发工作,
- *URIMATCHER类于匹配URI。它的用法如下。首先第一步把你需要匹配路径全部给注册上,如下常量
- *UriMatcher.NO_MATCH表示不匹配任何路径的返回码UrimatchersMatcher=new
- *UriMatcher(UriMatcher.NO_MATCH);
- *如果match()方法匹配content//com.smart.domain/person路径,返回匹配为1
- *sMatcher.addURI(content//com.smart.domain/person/1);
- *如果match()方法匹配content//com.smart.domain/person/230路径,返回匹配为2
- *sMatcher.addURI(content//com.smart.domain/person/#,2);/#为通配符
- *
- *这里讲一下,parse方法为任何的一个字符串转换为Uri地址
- *switch(sMatcher.match(Uri.parse("content//com.smart.domain/person/10"))){
- *
- *}
- *
- *
- *注册完需要匹配的URI后,就可以使用sMatcher.match(Uri)方法对输入进行匹配,如果匹配就返回匹配码
- *匹配码是调用ADDRUI()方法传入第三个参数,假设匹配content//com.smart.domain/person路径,返回的匹配码为1
- *
- ***/
- //增加
- @Override
- publicUriinsert(Uriuri,ContentValuesvalues){
- //返回的类型为,返回一路径,
- SQLiteDatabasedb=dbOpenHelper.getWritableDatabase();
- longid=0;
- //com.smart.domain/person/100
- switch(sMatcher.match(uri)){
- caseALLPERSON:
- //com.smart.domain/person/
- id=db.insert("person","name",values);//记是记录的行号,主健INT类,就是主健,
- returnContentUris.withAppendedId(uri,id);
- casePERSON:
- //com.smart.domain/person/20
- db.insert("person","name",values);
- Stringpath=uri.toString();
- //从0个开始,取到,com.smart.domain/person/20前面20的一个'/'
- returnUri.parse(path.substring(0,path.lastIndexOf('/'))+id);
- default:
- //返回一个参数
- thrownewIllegalArgumentException("UnkowUri:"+uri);
- }
- }
- @Override
- publicbooleanonCreate(){
- dbOpenHelper=newDataBaseOpenHelper(this.getContext());
- returntrue;
- }
- //查询
- @Override
- publicCursorquery(Uriuri,String[]projection,Stringselection,
- String[]selectionArgs,StringsortOrder){
- SQLiteDatabasedb=dbOpenHelper.getWritableDatabase();
- switch(sMatcher.match(uri)){
- caseALLPERSON:
- returndb.query("person",projection,selection,selectionArgs,null,null,sortOrder);
- casePERSON:
- longpersonid=ContentUris.parseId(uri);
- Stringwhere=TextUtils.isEmpty(selection)?"personid=?"
- :selection+"andpersonid=?";
- String[]params=newString[]{String.valueOf(personid)};
- if(!TextUtils.isEmpty(selection)&&selectionArgs!=null){
- params=newString[selectionArgs.length+1];
- for(inti=0;i<selectionArgs.length;i++){
- params[i]=selectionArgs[i];
- }
- params[selectionArgs.length+1]=String.valueOf(personid);
- }
- returndb.query("person",projection,where,params,null,null,sortOrder);
- default:
- thrownewIllegalArgumentException("UnkowUri:"+uri);
- }
- }
- //更新
- @Override
- publicintupdate(Uriuri,ContentValuesvalues,Stringselection,
- String[]selectionArgs){
- SQLiteDatabasedb=dbOpenHelper.getWritableDatabase();
- intcount=0;//返回的行数
- switch(sMatcher.match(uri)){
- caseALLPERSON:
- count=db.update("person",values,selection,selectionArgs);
- break;
- casePERSON://com.smart.domain/100
- longpersonid=ContentUris.parseId(uri);//得到100的记录
- //判断是否为空,为条件
- Stringwhere=TextUtils.isEmpty(selection)?"personid=?"
- :selection+"andpersonid=?";
- String[]params=newString[]{String.valueOf(personid)};
- if(!TextUtils.isEmpty(selection)&&selectionArgs!=null){
- params=newString[selectionArgs.length+1];
- for(inti=0;i<selectionArgs.length;i++){
- params[i]=selectionArgs[i];
- }
- params[selectionArgs.length+1]=String.valueOf(personid);
- }
- count=db.update("person",values,where,params);
- break;
- default:
- thrownewIllegalArgumentException("UnkowUri:"+uri);
- }
- returncount;
- }
- /*****
- *增加ContentUris类用于获取Uri路径后面的ID部分,它有两个实用的方法,
- *withAppendedld(Uri,id)用于为路径为上ID部分Uri
- *uri=Uri.parse("content://com.smart.domain/person");Uri
- *resultUri=ContentUris.withAppendedld(uri,10)
- *生成后Uri为:content://com.smart.domain/person/10
- *
- *更新的方法parseld(uri)方法用于从路径中获取ID部分Uri
- *uri=Uri.parse("com.smart.domain/person/10");long
- *personid=ContentUris.parseld(uri);//获取的结果为10
- *
- *
- ***/
- }
- <?xmlversion="1.0"encoding="utf-8"?>
- <manifestxmlns:android="http://schemas.android.com/apk/res/android"
- package="com.smart.dh"
- android:versionCode="1"
- android:versionName="1.0">
- <applicationandroid:icon="@drawable/icon"android:label="@string/app_name">
- <uses-libraryandroid:name="android.test.runner"/>
- <providerandroid:name=".PersonContentProvider"
- android:authorities="com.smart.provider.personprovider"
- android:permission="com.smart.provider.personprovider"/>
- <activityandroid:name=".DBActivity"
- android:label="@string/app_name">
- <intent-filter>
- <actionandroid:name="android.intent.action.MAIN"/>
- <categoryandroid:name="android.intent.category.LAUNCHER"/>
- </intent-filter>
- </activity>
- </application>
- <uses-sdkandroid:minSdkVersion="8"/>
- <instrumentationandroid:name="android.test.InstrumentationTestRunner"
- android:targetPackage="com.smart.dh"android:label="TestsforMyApp"/>
- </manifest>
- <!--android:permission="cn.itcast.provider.personprovider"
- 这行是指权限android:permission="com.smart.domain"
- com.smart.domain
- -->
大家记住了,两个工程,一定都导进来,然后运行。
更多相关文章
- Android(安卓)数据业务框架分析
- 基于Android(安卓)DataBinding的InverseBindingMethod改进SeekBa
- Android中ExpandableListView的使用
- 2010.10.30———Android(安卓)03
- android SIM卡状态
- Android上Sensor移植的总结
- android应用安全——数据安全
- Android之使用传感器获取相应数据
- mybatisplus的坑 insert标签insert into select无参数问题的解决