content providers 用于储存和接收数据同时把数据用于所有的应用。
这是应用之间共享数据的唯一方式。android中没有公共的数据区让应用可以使用、
android为一些常见的数据类型(audio,video,personal contact information)提供了一些content providers
如果你想创建自己的数据,可通过两种方式:
1.创建自己的content provider(通过ContentProvider子类)
2.你可以将数据加到现有的provider(如果它有相同的数据类型并且你有权限去操作它)
content provider如何存储数据是对设计者封闭的,但所有的content provider继承了同样的借口
去查询 这些provider 和返回结果,例如加入,改变,删除数据
用户可以直接使用这个接口,通过ContentResolver对象,
你可以通过调用getContentResolver()获得ContentResolver对象
ContentResolver cr = getContentResolver();
content provider 像数据库的表结构一样来显示它的数据
每一行是一条记录,每一列是指定类型的数据和含义
表中的每一行都包含一个唯一的ID, IDs可以用于在相关的表中匹配数据
查询时会返回一个Cursor对象,它可以一行一行的移动,一列一列的域中的内容
并且有特殊的方法去读取每种类型的数据,所以在读取数据时你要清楚哪种类型的数据在这里又涵盖
每种content provider 显示为一个公开的URI(通过Uri对象封装),Uri唯一定义了它的数据集
一个content provider 控制不同的数据集(不同的表)但对每个表只显示唯一的Uri,
对content来说,所有的Uri总是以“content://”开头。这种结构定义被content provider控制的数据
在定义自己的content provider时,最好是把它的Uris定义成常量,
可以简化代码和为将来的升级提供便利
每个ContentResolver方法将URI作为第一个参数
查询一个content provider
你需要三方面的信息
1.定义了provider的URI
2.你想要接收的数据域的名称
3.那些数据域的数据类型
可以通过ContentResolver.query() 或Activity.manageQuery()来查询
两者使用同样的参数,同样返回一个Cursor对象 ,但是后者导致这个Activity管理这个Cursor的生命周期
处理所有的细节,例如当activity暂停时卸载Cursor。你可以申请一个activity去管理一个没被管理的Cursor对象
通过调用
.Activity.startManagingCursor()
两个查询函数的第一个参数都是URI constant
为了限制一次查询对应一条记录,可以再URI后面添加ID
可以调用一些助手函数ContentUris.withAppendedId()和Uri.withAppendedPath()
去连接ID,两者都是静态方法,返回连接ID的Uri对象。两个函数除第一个参数外
null值表示返回所有的值,一些过滤细节可以跟SQL匹配
读取已经获得的数据
返回的指向一张表的Cursor对象,Cursor对象提供了相当多的助手函数
如果查询返回的是二进制数据例如图片或声音,数据可能直接进入这个表或者这个表的数据可能是
特殊的字符窜content:URI。一般20到50k以下的数据可用Cursor.getBlob,它返回一个二进制序列
如果表的入口是一个content:URI,就不应该直接的打开或读取(另外,权限问题也会导致失败)
应该调用ContentResolver.openInputStream()去获得InputStream对象,这个可以用于读取数据。
修改数据
主要有以下几种方式
添加记录
添加已有记录的数据
批处理已有的记录
删除记录
所有的操作要通过ContentResolver方法实现。对于某些provider还需要permission否者失败
创建content provider ,你必须
1.大多数的content provider存储数据通过android的文件存储方法或SQlite数据库
android提供SQLiteOpenHelper类去创建一个数据库同时用SQLiteDatabase类管理它
2.拓展ContentProvider类去处理数据
3.在AndroidManifest.xml中描述它
拓展ContentProvider类
可以定义一个ContentProvider子类去显示数据,然后通过ContentResolver and Cursor objects处理数据
所以这意味着要在Contentprovider中实现6个抽象函数
query()
insert()
update()
delete()
getType()
onCreate()
此处先省略200字。。。。
描述contentprovider
为了让系统知道以开发的contentprovider,需要用<provider>元素在AndroidManifest.xml描述
没有在xml中描述的话系统是不知道它的存在的
元素的名字完全等于Contentprovider的子类,authorities属性The authorities
attribute is the authority part of the content:
URI that identifies the provider
content URI 总结
content://com.example.autos.autoinfoprovider/honda/123
1.content://部分是不能被改变的
2.com.example.autos.autoinfoprovider
这个部分是provider在AndroidManifest.xml中authorities的属性
3.provider提供的数据类型,当只有一个时可以省略,也可更长显示如land/car
4.最后为要求的ID,如果没有限制单一的记录,就可以省略。