Android数据共享机制ContentProvider
一、简介
Android使用一种称为ContentProvider的概念来将数据抽象为服务,这种内容提供程序的理念看起来像启用了REST的数据提供程序。
要从ContentProvider检索数据或将数据保存到ContentProvider,需要使用一组类似REST的URI。例如,要从封装图书数据库的ContentProvider获取一组图书,需要使用以下形式的URI:要从图书数据库获得指定图书(如编号为:88图书),则要使用以下类似URI:设备上的任何应用程序都可以通过这些URI来访问或操作数据,所以在应用程序之间的数据共享上ContentProvider扮演着非常主要的角色。
二、Android内置的ContentProvider
Android中存在大量的内置ContentProvider,他们记录在SDK的android.provider包中,如:
Browser
Calllog
Contacts
People
Phones
Photos
Groups
MediaStore
Audio
Albums
Artists
Playlists
Images
Video
Settings
其中顶级项数据库,较低级的项是表。所以Browser、CAllog,MediaStore和Settings都是封装为ContentProvider的独立SQLite数据库.这些数据库通常具有扩展名.db。仅能从实现包访问,任何来自外部的访问都要通过ContentProvider接口。
三、ContentProvider架构
与网站一样,设备上的每个ContentProvider都会使用字符串注册本身,这个字符串类似网站域名,但称为:授权(Authority)。授权的注册则AndroidManifest.xml中进行。如:在进行了授权后,ContentProvider就拥有了以授权前缀开头的URI:注意:Android内置的ContentProvider可能没有完全限定的授权名,只有在使用第三方提供的时才使用完全限定名。这也就是为什么有时候仅使用Contacts来引用联系人ContentProvider。
1、Android内容URI的结构
Android中的内容URI类似于Http URL,但他们以content://开头具有一下通用形式:2、Android MIME类型的结构
就像网站返回给指定URI的MIME类型一样,ContentProvider也负责返回给URI的MIME类型。MIME类型包括两部分:类型和子类型。如:类型和子类型对于他们所表示的内容必须是唯一的,且如果类型和子类型不是标准的,则需要在他们前面加上vnd。
3、使用URI读取数据
要从ContentProvider获取数据,需要使用该ContentProvider提供的URI。
如下:为从联系人提供程序获取单行联系人信息在上面的基础上我们来看看,如何获取一个游标,这个游标包含来自contactsContentProvider的People表的一组特定的列。4、使用游标
在使用Android游标前,先了解一些关于游标的的知识。
游标是一个行集合;
读取数据之前,需要使用moveToFirst(),因为游标放在第一行之前;
需要知道列的名称和类型;
所有字段访问都基于列编号,所以必须首先将列名称转换为列编号;
游标可以随意移动;
可以使用游标获取行计数;
使用while循环导航游标:使用for循环导航游标
Android使用一种称为ContentProvider的概念来将数据抽象为服务,这种内容提供程序的理念看起来像启用了REST的数据提供程序。
要从ContentProvider检索数据或将数据保存到ContentProvider,需要使用一组类似REST的URI。例如,要从封装图书数据库的ContentProvider获取一组图书,需要使用以下形式的URI:
- content://com.android.book.BookProvider/books
- content://com.android.book.BookProvider/books/88
二、Android内置的ContentProvider
Android中存在大量的内置ContentProvider,他们记录在SDK的android.provider包中,如:
Browser
Calllog
Contacts
People
Phones
Photos
Groups
MediaStore
Audio
Albums
Artists
Playlists
Images
Video
Settings
其中顶级项数据库,较低级的项是表。所以Browser、CAllog,MediaStore和Settings都是封装为ContentProvider的独立SQLite数据库.这些数据库通常具有扩展名.db。仅能从实现包访问,任何来自外部的访问都要通过ContentProvider接口。
三、ContentProvider架构
与网站一样,设备上的每个ContentProvider都会使用字符串注册本身,这个字符串类似网站域名,但称为:授权(Authority)。授权的注册则AndroidManifest.xml中进行。如:
- <provider android:name="BookProvider" android:authorities="com.myCompany.BookProvider"/>
- content://com.myCompany.BookProvider/
1、Android内容URI的结构
Android中的内容URI类似于Http URL,但他们以content://开头具有一下通用形式:
- Content://*/*/
- 或
- content://authority-name/path-segment1/path-segment2/etc......
就像网站返回给指定URI的MIME类型一样,ContentProvider也负责返回给URI的MIME类型。MIME类型包括两部分:类型和子类型。如:
- text/html
- text/css
- text/xml
- application/pdf
- application/vnd.ms-excel
3、使用URI读取数据
要从ContentProvider获取数据,需要使用该ContentProvider提供的URI。
如下:为从联系人提供程序获取单行联系人信息
- Uri baseUri = Contacts.People.CONTENT_URI;
- uri myPersonUri = baseUri.withAppendedPath(Contacts.People.CONTENT_URI,"80");
- Cursor cur = manageQuery(myPersonUri,null,null,null);
- String[] projection = new String[]{
- People._ID,
- People.NAME,
- People.NUMBER
- };
- Uri mContactsURi = Contacts.People.CONTENT_URI;
- Cursor managedCursor = managedQuery(
- projection,
- null,
- Contacts.People.NAME + "ASC"
- );
在使用Android游标前,先了解一些关于游标的的知识。
游标是一个行集合;
读取数据之前,需要使用moveToFirst(),因为游标放在第一行之前;
需要知道列的名称和类型;
所有字段访问都基于列编号,所以必须首先将列名称转换为列编号;
游标可以随意移动;
可以使用游标获取行计数;
使用while循环导航游标:
- if (cur.moveToFirst == false){
- return;
- }
- int nameColumnIndex = cur.getColumnIndex(People.NAME);
- String name = cur.getString(nameColumnIndex);
- while (cur.moveToNext()){
- //获取属性值
- }
- int nameColumn = cur.getColumnIndex(People.NAME);
- int ploneColumn = cur.getColumnIndex(People.NUMBER);
- for(cur.moveToFirst();!cur.isAfterLast();cur.moveToNext()){
- String name = cur.getString(nameColumn);
- String phoneNumber = cur.getString(phoneColumn);
- }
相关推荐
IT之家 2020-03-11
graseed 2020-10-28
zbkyumlei 2020-10-12
SXIAOYI 2020-09-16
jinhao 2020-09-07
impress 2020-08-26
liuqipao 2020-07-07
淡风wisdon大大 2020-06-06
yoohsummer 2020-06-01
chenjia00 2020-05-29
baike 2020-05-19
扭来不叫牛奶 2020-05-08
hxmilyy 2020-05-11
黎豆子 2020-05-07
xiongweiwei00 2020-04-29
Cypress 2020-04-25
冰蝶 2020-04-20