ContentProvider

ContentProvider
一、概述
ContentProvider-内容提供器,是应用程序之间共享数据的接口,Android系统将这种机制应用到方方面面。比如


:联系人提供器专为不同应用程序提供联系人数据
ContentProvider是Android四大组件之一,Android提供了四种数据存取技术。这四种技术都能由ContentProvider


提供的方法按统一的代码格式存取,即以一致性的方法操作多样性的数据源。
ContentProvider机制可支持在多个应用中存储和阅读数据。这是跨应用共享数据的重要方式。
Android提供了预定义的ContentProvider用于方便操作内存卡和SD可上存储的音频、视频图片和私人通讯录等。
ContentProvider是一个抽象类,必须继承,由子类实现该类中的抽象方法。
ContentProvider类中定义了insert(),delete(),update(),query()等抽象方法用于外部应用程序操作数据提供增


删改查的操作。
ContentProvider类中定义了供外部应用操作数据的地址:Uri
外部应用程序通过ContentResolver类,按Uri的地址操作ContentProvider暴露的数据。
二、系统预定义ContentProvider的使用步骤
步骤1:获取系统预定义的Uri
步骤2:在应用程序中获取ContentProvider类的对象,调用该类的增删改查的方法
通过步骤一获取的系统预定义的uri地址操作数据
提示:contentResovler类相当于操作数据的中间件,该类中提供了增删改查等方法用来操作ContentProvider所暴


露的数据。
三、ContentProvider类的抽象方法
1.public Cursor query(Uri uri,String []projection,String selection,String []selectionArgs,String 


sortOrder)
作用:查询指定数据地址的数据源,返回的Cursor类型的结果集。
参数Uri:采标被操作数据的地址
参数projection:查询表中指定列,若是所有列的都查询,则写为null
参数selection:查询条件(SQL字符串),若没有条件,则写为null;
参数selectionArgs:若上一个参数(查询条件)中有占位符,则本参数提供与占位符对应的数据。
参数sortOrder:排序方式,null表示默认的排序方式(升序)
2.public String getType(Uri uri)
作用:返回当前Uri代表的数据的MIME类型
3.public Boolean onCreate()
作用:在ContentProvider对象创建后第一个调用的方法
4.public Uri insert(Uri uri,ContentValues values)
作用:根据Uri的地址,向指定文件或数据库中插入values中的数据。并返回该记录的_id值,该列是主键并且是自


动增长的标识列
5.public int delete(Uri uri,String selection,String[] selectionArgs)
作用:删除Uri中指定条件的数据
参数selection:指定条件的SQL字符串
参数selectionArgs:若selection的条件中有占位符,则本参数提供填充占位符的数据
返回值:返回删除的行数
6.public int update(Uri uri,ContentValues values,String selection,String []selectionArgs)
作用:根据Uri,按selection指定的条件将数据修改为values
参数selectionArgs:若selection的条件中有占位符,则本参数提供填充占位符的数据
返回值:返回修改的行数
四、Uri
(一)概述
Uri是Uniform Resource Identifier的简称,Web的资源,如HTML文档等都用一个通用资源标识符来定位
(二)Uri的结构
Uri的结构类似于网址,如下:
scheme://authority/path
1.scheme协议:Android规定:在数据共享时,协议名必须是content。
2.authority授权:唯一标识ContentProvider的字符串,该字符串在Android应用程序中必须唯一
与网站类似,每个ContentProvider都会使用字符串注册自己,该字符串类似于网站的域名没在Android中称为授权


,该授权必须唯一,ContentProvider以该字符串作为向外部提供数据访问的基础Uri。
3.路径(或资源索引值):通过索引值查找指定的资源。
content://com.ityw.myContentProvider/books
表示该ContentProvider提供了操作若干书籍的地址,这里
content://是android操作数据的scheme
com.ityw.myProvider是authority
books表示一个存放书籍的集合
content://com.ityw.myProvider/books/#20
表示数据集合中索引值是20的一本书
五、MIME
(一)概述
MIME的英文全称是"Multipurpose Internet Mail Extensions"多用途互联网邮件扩张,他是一个互联网标准,在


1992年最早应用于电子邮件系统,后来应用到浏览器。服务器将MIME标志符放入传送的数据中来告诉浏览器使用哪


些插件读取相关文件。
MIME类型:设定某种扩展名的文件用一种应用程序来打开,当该扩展名被访问的时候,Android会自动使用指定应


用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式。
MIME包含两部分:类型和子类型,中间有/分隔,以下是主要的MIME类型
text/html
text/css
images/jpeg
application/pdf
application/vnd.ms-excel
如果供应商具有专有的数据格式,那么子类型名称将以vnd开头,例如:
application/vnd.ms-excel
如果是非专用的数据格式,则无需vnd开头
application/pdf
(二)Android的MIME
Android遵循类似的约定来定义MIME类型。Android类型中的vnd表示这些类型和子类型具有非标准的、供应商专用


的格式
为确保唯一性,Android的MIME使用了类型/子类型的格式
Android使用两种格式分别表示多条记录和单条记录
1.单挑记录的MIME格式类似于以下格式
vnd.android.cursor.item/vnd.companyname.contenttype
提示:
单条记录的主类型必须是vnd.android.cursor.item,子类型若是自定义的专用类型则必须是vnd开头,后面的字符


串自行定义。
2.多条记录的MIME格式类似于以下格式:
vnd.android.cursor.dir/vnd.com[anyname.contenttype
提示:
多条记录的主类型必须是vnd.android .cursor.dir,子类型若是自定义自定义的专用类型则必须是vnd来头,后面


的字符串自行定义。
说明:
1)MIME类型在你Android中使用非常广泛,尤其在Intent中,系统通过MIME类型决定调用响应的Activity处理数据
2)MIME类型通过ContentProvider的Uri得出
六、ContentResolver类
(一)概述
ContentResovler类相当于操作数据的中间件,该类中提供了与ContentProvider类中相同的增删改查的方法。在外


部操作ContentProvider所暴露的数据。
只要获得了ContentProvider类中定义的Uri,就能调用ContentProvider类中的同名方法操作ContentProvider所暴


露的数据。
(二)常用方法
1.public Uri insert(Uri uri,ContentValues values)
作用:根据Uri提供的地址,向指定数据源(数据库、文件等)插入values中的数据。
说明:
Uri是ContentProvider类在项目清单文件中注册时的authority属性的值。
2.public int insert(Uri uri,String selection selection,String[] selectionArgs)
作用:根据Uri提供的地址,调用ContentProvider类中的同名方法,在指定数据库(或文件)中删除selection中


指定条件的记录。
3.public int update(Uri uri,ContentValues values,String selection,String [] selectionArgs)
作用:根据Uri提供的地址,调用ContentProvider类中的同名方法,在指定数据库(或文件)中按selection指定


的条件将数据修改为values中的值
4.public Cursor query(Uri uri,String[]projection,String selection,String[]selectionArgs,String 


sortOrder)
作用:根据Uri提供的地址,调用ContentProvider类中的同名方法,在指定数据库中查询出所有匹配selection的


数据,其中projection是要查询列名表,指定查询的数据列。
(三)获取ContentResolver对象
ContentResolver ContentResolver=this.getContentResolver();
说明:this是当前组件对象,例如:Activity类的对象。
七、通过预定义的Uri操作多媒体数据
(一)概述
Android为应用程序操作常见的数据提供了预定义的Uri,如视频、音频、图片、文件、数据库等。
Android中的以上数据可能存放在内存卡中,也可能存放在SD卡。并且很可能存放在不同文件夹中。通过Uri首先可


以指定要访问的是哪种类型的数据,其次指定访问的数据是在内存卡还是在SD卡,最后通过条件查找符合条件的数


据。至于那个文件夹则无需考虑。
以上访问数据的方式提供了对不同类型的数据一致性的操作,有效地简化了编程
(二)操作图片数据
1.访问SD卡图片的Uri
android.provider.MeadiaStore.Images.Media.EXTERNAL_CONTENT_URI
2.访问内存卡中的图片Uri
android.provider.MediaStrore.Images.Media.INTERNAL_CONTENT_URI
3.MediaStore类
MediaStore类是Android多媒体开发常用类,该类位于android.provider包下,该类中定义了Images、Audio、


Video等内部类,用于表示图片、音频和视频。
4.Images类
Images类是MediaStore类的内部类,用于表示图片数据。该类中定义了一组常量用于表示图片的属性。
5.Images.Media的常量
1)Images.Media._ID:图片的id值,该值由系统创建
2)Images.Media.DISPLAY_NAME:图片的显示名
3)Images.Media.DESCRIPTION:图片的详细描述
。。。。
6.Thumbnails
Thumbnails类用于获取系统中的视频或图片的缩略图。该类提供了以下方法获取缩略图:
public static Bitmap getThumbnail(ContentResolver cr,long origId,int kind,BitmapFactory.Options 


options)
作用:获取指定id的缩略图
参数-cr:ContentResolver对象
参数origId:图片的Id值
参数-kind:缩略图的类型,有两个常量:
Thumbnails.MICRO_KIND:最小类型
Thumbnails.MINI_KIND:迷你类型
参数:options:BitmapFactory.Options类型用于预防图片过大造成内存溢出,若不考虑溢出问题,则此处可设置


为null。
(三)操作音频数据
1.访问SD卡音频的Uri
android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI
2.访问内存卡音频的Uri
android.provider.MediaStore.Audio.Media.IMTERNAL_CONTENT_URI
3.Audio.Media的常量
1)Audio.Media._ID:音频的id值,该值由系统创建
2)Audio.Media.DISPLAY_NAME:音频的显示名
。。。。
(四)操作视频数据
1.访问SD卡视频的Uri
android.priovider.MediaStore.Video.Media.EXTERNAL_CONTENT_URI
2.访问内存卡视频的Uri
android.provider.MediaStore.Video.Media.INTERNAL_CONTENT_URI
3.Video.Media类的常量
1)Video.Media._ID:视频的id
2)Video.Media.ALBUM:视频所在的专辑
。。。
八、解决模拟器中文乱码问题
在Android模拟器中,默认情况下使用ISO-8859-1对中文进行编码/译码,而Windows系统默认的编码是GBK。
从模拟器的SD卡读到的数据是按Windows的GBK解码的,所以会出现乱码问题
因此在程序中要将获取的中文字符串先编码为ISO8859-1的字节数组,然后该字节数组解码为GBK。示例代码:
String title=c.getString(c.getColumnIndex(Audio.Media.TITLE));
title=new String(title.getBytes("iso8859-1"),"GBK");





  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值