发表于: 2018-12-09 17:17:06
0 895
一、今天完成的事情
ContentProvider可以理解为一个Android应用对外开放的接口,只要是符合它所定义的Uri格式的请求,均可以正常访问执行操作。其他的Android应用可以使用ContentResolver对象通过与ContentProvider同名的方法请求执行,被执行的就是ContentProvider中的同名方法。所以ContentProvider很多对外可以访问的方法,在ContentResolver中均有同名的方法,是一一对应的。
Uri
在Android中,Uri是一种比较常见的资源访问方式。而对于ContentProvider而言,Uri也是有固定格式的:
<srandard_prefix>://<authority>/<data_path>/<id>
<srandard_prefix>:ContentProvider的srandard_prefix始终是content://。
<authority>:ContentProvider的名称。
<data_path>:请求的数据类型。
<id>:指定请求的特定数据。
ContentProvider
ContentProvider也是Android应用的四大组件之一,所以也需要在AndroidManifest.xml文件中进行配置。而且某个应用程序通过ContentProvider暴露了自己的数据操作接口,那么不管该应用程序是否启动,其他应用程序都可以通过这个接口来操作它的内部数据。
Android附带了许多有用的ContentProvider,但是本篇博客不会涉及到这些内容的,以后有时间会再讲解。Android附带的ContentProvider包括:
Browser:存储如浏览器的信息。
CallLog:存储通话记录等信息。
Contacts:存储联系人等信息。
MediaStore:存储媒体文件的信息。
Settings:存储设备的设置和首选项信息。
在Android中,如果要创建自己的内容提供者的时候,需要扩展抽象类ContentProvider,并重写其中定义的各种方法。然后在AndroidManifest.xml文件中注册该ContentProvider即可。
ContentProvider是内容提供者,实现Android应用之间的数据交互,对于数据操作,无非也就是CRUD而已。下面是ContentProvider必须要实现的几个方法:
onCreate():初始化提供者。
query(Uri, String[], String, String[], String):查询数据,返回一个数据Cursor对象。
insert(Uri, ContentValues):插入一条数据。
update(Uri, ContentValues, String, String[]):根据条件更新数据。
delete(Uri, String, String[]):根据条件删除数据。
getType(Uri) 返回MIME类型对应内容的URI。
除了onCreate()和getType()方法外,其他的均为CRUD操作,这些方法中,Uri参数为与ContentProvider匹配的请求Uri,剩下的参数可以参见SQLite的CRUD操作,基本一致,SQLite的内容在另外一篇博客中有讲解:Android--数据持久化之SQLite。、
Tips:还有两个非常有意思的方法,必须要提一下,call()和bulkInsert()方法,使用call,理论上可以在ContentResolver中执行ContentProvider暴露出来的任何方法,而bulkInsert()方法用于插入多条数据。
在ContentProvider的CRUD操作,均会传递一个Uri对象,通过这个对象来匹配对应的请求。那么如何确定一个Uri执行哪项操作呢?需要用到一个UriMatcher对象,这个对象用来帮助内容提供者匹配Uri。它所提供的方法非常简单,仅有两个:
void addURI(String authority,String path,int code):添加一个Uri匹配项,authority为AndroidManifest.xml中注册的ContentProvider中的authority属性;path为一个路径,可以设置通配符,#表示任意数字,*表示任意字符;code为自定义的一个Uri代码。
int match(Uri uri):匹配传递的Uri,返回addURI()传递的code参数。
在创建好一个ContentProvider之后,还需要在AndroidManifest.xml文件中对ContentProvider进行配置,使用一个<provider.../>节点,一般只需要设置两个属性即可访问,一些额外的属性就是为了设置访问权限而存在的,后面会详细讲解:
android:name:provider的响应类。
android:authorities:Provider的唯一标识,用于Uri匹配,一般为ContentProvider类的全名。
ContentResolver
ContentResolver,内容访问者。可以通过ContentResolver来操作ContentProvider所暴露处理的接口。一般使用Content.getContentResolver()方法获取ContentResolver对象。上面已经提到ContentResolver的很多方法与ContentProvider一一对应,所以它也存在insert、query、update、delete等方法。
Android Studio多版本共存
昨天为了导入一个项目,折腾了半天,因为这个 项目使用Android Studio3.0之前的版本开发的,而我电脑上装的是3.2,其实多个版本的Android Studio是可以在同一系统上共存的,实现多版本共存,下次再导入项目就不会出现各种各样的问题了,尤其是事件紧迫的时候。
1.下载所需要的版本
下载zip压缩包
2.解压,运行
3.配置
主要注意以下几个步骤
选择Do not import setting
Install Type选择Custom
在SDK Components Setup界面,在SDK Location选项中,选择原先版本studio下载好的SDK路径
这样就搞定了,其实还是很简单的,试着用旧版本将之前的项目导入,一下子就成功了。
二、明天的计划
继续看ContentProvider
继续任务十
三、遇到的问题
实现应用内跳转到支付宝支付需要签约并提供营业执照,微信支付也需要相关证明,不知该这么去实现支付功能。
四、收获
导入不同版本的AS开发的项目时会遇到许多问题,实现多版本AS共存后可以很好地解决这个问题,提升了效率。
评论