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

更多相关文章

  1. [android]数据库SQLiteDatabase简介
  2. Android数据库应用(《Android开发入门与实战》选摘)
  3. 使用attrs.xml自定义属性
  4. Android中使用Gson解析JSON数据,以及把JSON数据映射成一个对象
  5. Storm——Android SQLite数据库管理类库
  6. 自定义android圆形ImageView
  7. Android 监听ContentProvider中数据的变化 Android 监听ContentP
  8. Android 存储字符串数据到txt文件
  9. Android 开发:(十四)NavigationBar篇-自定义顶部导航栏

随机推荐

  1. android 自定义弹出窗口
  2. 小知识:android
  3. 用TextView自定义按钮
  4. Ubuntu-18.04 LTS配置android系统源码编
  5. Could not find com.android.tools.build
  6. Android(安卓)Fresco图片处理库用法API英
  7. [Android]设置Activity为全屏显示的两种
  8. Android(安卓)- 折线图
  9. Android井字棋
  10. js检测手机类型(android,ios,blackberry,w