android content providers相关

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,如果没有限制单一的记录,就可以省略。

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值