android中内容提供器

1.内容提供器:主要用于在不同程序之间实现数据共享的功能,他提供了一套完整的机制,允许一个程序访问另一个程序的机制,同时还能保证被访数据的安全性。是Android实现跨进程共享数据的标准方式。
内容提供器可以选择只对哪一部分数据进行共享,从而保证我们的隐私数据不被泄露的风险。
2.Android运行时权限,需要在AndroidManifest.xml中加入权限声明,否则我们的程序会崩溃。
android将权限归为普通权限,指的是那些不会直接威胁到用户的安全和隐私的权限。这部分权限申请,系统会自动帮我们进行授权。
危险权限,表示那些可能会触及到用户隐私或者对设备安全性造成影响的权限。对于这部分权限,必须由用户手动点击授权才可以,否则程序就无法使用相应的功能。
特殊权限。
Android中所有的危险权限,一个9组24个权限
权限名称 权限名

CALENDAR READ_CALENDARWRITE_CALENDAR
CAMERA CAMERA
CONTACTS READ_CONTACTSWRITE_CONTACTSGET_ACCOUNTS
LOCATION ACCESS_FINE_LOCATIONACCESS_COARSE_LOCATION

MICROPHONE RECORD_AUDIO
PHONE READ_PHONE_STATECALL_PHONEREAD_CALL_LOGWRITE_CALL_LOGADD_VOICEMAILUSE_SIPPROCESS_OUTGOING_CALLS
SENSORS BODY_SENSORS
SMS SEND_SMSRECEIVE_SMSREAD_SMSRECEIVE_SMSRECEIVE_MMS

STORAGE READ_EXTERNAL_STORAGEWRITE_EXTERNAL_STORAGE
内容提供器用法一般有两种:一种是使用现有的内容提供器来读取和操作相应程序中的数据。另一种是创建自己的内容提供器给我们程序的数据通过外部访问接口。

ContentResolver基本用法:
如果想要访问内容提供器中共享的数据,就一定要借助Content’Resolver类,可以通过Context中的getContentResover()方法获取到该类的实例。ContentResolver中提供了一系列的方法用于对数据进行CRUD操作,其中insert()方法添加数据,update()更新数据,delete()方法删除数据,query()查询数据。
ContentResolver中的增删改查方法都是不接受表名参数的,而是使用一个Url参数代替,这个参数被叫做内容URI,内容URI给内容提供器中的数据建立了唯一标识符。主要由两部分组成:authority和path。前者是用于对不同的应用程序做区分的,一般为避免冲突,都会采用程序包名的方式来进行命名 。比如某个程序包名为com.example.app,那么该程序对应的authonrity可以命名为com.example.app.provider。后者是用于对同一应用程序中不同的表做区分的,通常都会添加到authority的后面。如:某个程序的数据库里存在两张表:table1和table2.这时就可以将path分别命名为/table1和/table2然后把authority和path进行组合,内容URI就变成了com.example.app.provider/table1和com.example.app.provider/table2.目前很难辩认出两个字符串就是两个内容URI,故我们需要在字符串头部添加协议声明。
格式如下:content://com.example.app.provider/table1
content://com.example.app.provider/table1
得到内容URI字符串之后,我们还需要将他解析成Uri对象才可以作为参数传入。解析的方法如下:
URI uri=Uri.parse(“content://com.example.app.provider/table1”)
只需调用Uri.parse()方法,就可以将内容URI字符串解析成Uri对象了。

使用Uri对象来查询table1表中的数据,
Cursor cursor=getContentResolver().query(
uri,
projection,
selectionArgs,
sortOrder
);
query()方法参数 对应SQL部分 描述
uri from table_name 指定查询某个应用程序下的某一张表
projection select column1,column2 指定查询的列名
selection where column=value 指定where的约束条件

selectionArgs - 为where中的占位符提供具体的值
sortOrder order by column1,colunm2 指定查询结果的排序方式
查询完成后仍是一个Cursor对象,这时就可以将数据从Cursor对象中去出来
if(cursor!=null){
while(cursor.moveToNext()){
String column1=cursor.getString(cursor.getColumnIndex(“column1”));
int column2=cursor.getInt(cursor.getColumnIndex(“column2”));
}
cursor.close;
}
向表中添加一条数据
ContentValues values=new ContentValues();
values.put(“column1”,“text”);
values.put(“column2”,1);
getContentResolver().insert(uri,values);
更新这条添加的数据,把column1的值清空,可以借助ContentResolver的update()方法实现。
ContentValues values=new Contentvalues();
values.put(“column1”,"");
getContentResolver().update(uri,values,“column1=? and column2=?”,new String[]{“text”,“1”});
删除这条数据
getContentResolver().delete(uri,“column2=?”,new String[]{“1”});

URI的格式主要有两种:
1.content://com.example.app.provider/table1
2.content://com.example.app.provider/table1/1 表示table1表中id为1的数据
使用通配符来分别匹配这两种格式的内容URI,规则如下:
:表示匹配任意长度的任意字符
#:表示匹配任意长度的数字
一个能够匹配任意表的内容URI格式就可以写成:
content://com.example.app.provider/

一个能够匹配table1表中任意一行数据的内容URI格式就可以写出:
content://com.example.app.provier/table1/#
然后可以借助UriMatcher这个类就可以轻松实现匹配内容URI的功能。UriMatcher中提供了一个addURI()方法接收2个参数,可以分别把authority,path和一个自定义代码传进去。当调用UriMatcher的match()方法时就可以将一个Uri对象传入,返回值是某个能匹配这个Uri对象所对应的自定义代码,利用这个代码就可以判断出调用方期望访问的是哪张表中的数据了

发布了25 篇原创文章 · 获赞 1 · 访问量 710

猜你喜欢

转载自blog.csdn.net/weixin_43551957/article/details/103992032