【Android 学习】四大组件(三)——Content Provider

来源:互联网 发布:unity3d免费模型 编辑:程序博客网 时间:2024/05/17 03:00

本文转载自:http://blog.csdn.net/conowen/article/details/7273142

1、Content Provider(内容提供者)简介

         从字面上的意思来看,Content Providers是内容提供者,也就是数据的提供者,而数据的来源可以是SQLite数据库或者File存储等等方式。为了实现各个应用程序之间的数据共享,可以把应用程序的私有数据封装成ContentProviders,接着定义一个URI,向外提供统一的数据接口。其他的应用程序可以通过这个URI来访问指定的数据,然后实现各种操作,如添加(insert)、删除 (delete)、查询(query)、修改(update)。而不用去操作应用程序的底层私有数据。一般来说底层的私有数据是基于SQLite建立的。

和其他app共享数据的大体过程:

        为方便其它app与用户的应用程序的ContentProvider通信,通常要自定义一个公共的Uri:CONTENT_URI,其它app通过这一Uri,与ContentProvider交流。需要注意的是,当用户自己建立好ContentProvider之后,并不直接与之打交道,而是通过ContentResolver进行操作。


2、Content Provider的使用

2.1、利用ContentResolver方法管理content Provider

            Android提供了ContentResolver(内容分解器),外界的程序可以通过ContentResolver的方法来管理ContentProvider提供的数据。

            简单来说,Resolver就是分解、管理 Provider的数据内容。在理解Resolver之前,应该知道URI。事实上可以这样理解,URI就是一个地址,对应着Content Provider的数据内容(关于URI的更详细部分,可参看文章最后)。

           ContentResolver是通过URI来查询ContentProvider,ContentResolver采用的是类似数据库的操作(SQLite)来从Content providers中获取数据。


ContentResolver的主要接口方法,如下:(来自android 官方文档)


返回值       函数声明final Uriinsert(Uri url, ContentValues values)Inserts a row  into a table at the given URL.final intdelete(Uri url, String where, String[] selectionArgs)Deletes row(s)  specified by a content URI.final  Cursor             query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)Query the given  URI, returning a Cursor over the result set.final intupdate(Uri uri, ContentValues values, String where, String[] selectionArgs)Update row(s) in  a content URI.

要获取ContentResolver的话,可以调用getContentResolver ()方法,


a、例如下面演示query(查询)方法:

由上表可知query方法返回值为Cursor,代码如下

[java] view plaincopy
  1. ContentResolver cr = getContentResolver();  
  2. Cursor cursor = cr.query(ContactsContract.Contacts.CONTENT_URI, nullnullnullnull);  

获得cursor (游标)(也可以用.managedQuery()方法来获取cursor,两者参数一样,区别是第二种方法可以管理Cursor的生命周期。

如Cursor cr = managedQuery(myPerson, null, null, null, null);)

那为什么要获取Cursor呢?因为通过query(查询)而得到的数据,要通过Cursor的方法来读取。(只是读取而已)

b、其他方法(注意返回值)

同样地,比如把android改名为apple。可调用ContenResolver.update()方法。

删除单个记录,调用ContentResolver.delete()方法,在参数中,指定到具体行即可。

如果是删除多个记录,调用ContentResolver.delete()方法,URI参数指定Content Provider即可,并带一个类似SQL的WHERE子句条件。

     

2.2、如何把一个应用程序的数据共享出去。

          a、创建自己的Content provider(需要继承ContentProvider类)

          b、如果这个应用程序的数据和已存在的Content provider数据结构是一致的,在获得该Content provider的“写”权限之后,

                   把数据写到已存在的Content provider中。






/********************************************附录**********************************/

1、URI的简介

通用资源标志符(Universal Resource Identifier, 简称"URI")。

Android上可用的每种资源 - 如图像、视频、通讯录、短信等等都可以用URI来表示。

URI也包括URL和和URN(为了便于理解,下面对比两者)

其中URL很容易理解,就是平常所说的网页地址。

众所周知,URL不仅可以标识特定网站,也可以标识这个网站某个特定网页。

同样地,URI不仅可以标识特定Content Provider,还可以标识这个应用程序的Content Provider中特定的数据库表。

这两者是类似的

关于三者更详细的对比,可参考此文章

http://www.eoeandroid.com/thread-526-1-1.html



 2、URI的组成部分

一个完整的URI一般由4部分组成:

将其分为A,B,C,D

[java] view plaincopy
  1. "content://conowen.szu.mycontenprovider/tablename/#" #表示数据id  

A:通用前缀"content://",用来说明一个Content Provider控制这些数据。

B:URI 的标识,它定义了是哪个Content Provider提供这些数据。对于第三方应用程序,为了保证URI标识的唯一性,它必须是一个完整的、小写的   类名。

    这个标识在 元素的 authorities属性中说明:一般是定义该ContentProvider的包.类的名称 。

C:数据库中表的名字(如通讯录)

D:如果URI中包含表示需要获取的记录的ID;则就返回该ID对应的数据,如果没有ID,就表示返回全部;(如读取通讯录时,有ID表示某个联系人,没有ID表示整个通讯录)




Android系统提供了两个用于操作Uri的工具类,分别为UriMatcherContentUris


UriMatcher

UriMatcher 类主要用于匹配Uri.

 


ContentUris

ContentUris 类用于获取Uri路径后面的ID部分

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 吃水果伤胃了怎么办 大人吃退烧药不出汗怎么办 稍微吃点凉水果胃就疼怎么办 1岁宝宝感冒发烧怎么办 3岁小儿反复发烧怎么办 热感冒喉咙疼要怎么办 孩子感冒咳嗽嗓子疼怎么办 孕妇感冒了嗓子疼咳嗽怎么办 4岁宝宝反复高烧怎么办 小孩吃完药不退烧怎么办 六个月婴儿发烧怎么办退烧快点 咳嗽20天老不好怎么办 吃过退烧药出汗怎么办 5岁儿童发烧39度怎么办 小孩烧到39度怎么办 儿童7岁发烧39度怎么办 发烧没药怎么办怎样退烧快 小孩发烧怎么办怎样退烧快 发烧头疼怎么办最快最有效 发烧头晕怎么办最快最有效 婴儿发烧怎么办最快最有效 孩子一直37度8怎么办 一岁半宝宝37度5怎么办 发烧打了针35度怎么办 小孩发烧吃了鱼怎么办 八个月婴儿发烧39度怎么办 婴儿反复发烧39度怎么办 宝宝发烧了怎么办如何退烧 宝宝烧到38.8度怎么办 小孩发烧到39度怎么办 宝贝发烧到40度怎么办 孩子发烧39度8怎么办 儿子发烧39度该怎么办 孩子发烧39度7怎么办 7个月婴儿发烧怎么办 感冒了头发很油怎么办 5岁宝宝发烧39度怎么办 婴儿烧到39.5度怎么办 1岁多宝宝39.5度怎么办 宝宝发烧40多度怎么办 7岁宝宝发烧了怎么办