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

简介: 本文转载自:http://blog.csdn.net/conowen/article/details/72731421、Content Provider(内容提供者)简介         从字面上的意思来看,Content Providers是内容提供者,也就是数据的提供者,而数据的来源可以是SQLite数据库或者File存储等等方式。

本文转载自: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 Uri insert(Uri url, ContentValues values)Inserts a row  into a table at the given URL.
final int delete(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 int update(Uri uri, ContentValues values, String where, String[] selectionArgs)Update row(s) in  a content URI.


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


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

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

[java]  view plain copy
  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 plain copy
  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部分

相关文章
|
2月前
|
监控 Unix 应用服务中间件
Android-音视频学习系列-(八)基于-Nginx-搭建(rtmp、http)直播服务器
Android-音视频学习系列-(八)基于-Nginx-搭建(rtmp、http)直播服务器
|
2天前
|
SQL XML Java
Android 这 13 道 ContentProvider 面试题,你都会了吗?
Android 这 13 道 ContentProvider 面试题,你都会了吗?
|
4天前
|
API Android开发 开发者
`RecyclerView`是Android API 21引入的UI组件,用于替代ListView和GridView
【6月更文挑战第26天】`RecyclerView`是Android API 21引入的UI组件,用于替代ListView和GridView。它提供高效的数据视图复用,优化的布局管理,支持多种布局(如线性、网格),并解耦数据、适配器和视图。RecyclerView的灵活性、性能(如局部刷新和动画支持)和扩展性使其成为现代Android开发的首选,特别是在处理大规模数据集时。
17 2
|
14天前
|
JavaScript Java Android开发
kotlin安卓在Jetpack Compose 框架下跨组件通讯EventBus
**EventBus** 是一个Android事件总线库,简化组件间通信。要使用它,首先在Gradle中添加依赖`implementation 'org.greenrobot:eventbus:3.3.1'`。然后,可选地定义事件类如`MessageEvent`。在活动或Fragment的`onCreate`中注册订阅者,在`onDestroy`中反注册。通过`@Subscribe`注解方法处理事件,如`onMessageEvent`。发送事件使用`EventBus.getDefault().post()`。
|
23天前
|
XML Android开发 数据格式
【Android UI】中间对齐UI组件
【Android UI】中间对齐UI组件
13 1
|
2天前
|
搜索推荐 Android开发 开发者
Android 自定义组件
Android 自定义组件
6 0
|
3天前
|
存储 程序员 定位技术
程序员必知:安卓的四大组件
程序员必知:安卓的四大组件
|
27天前
|
安全 数据库 Android开发
45. 【Android教程】内容提供者 - Content Provider
45. 【Android教程】内容提供者 - Content Provider
19 2
|
2月前
|
存储 定位技术 开发工具
Android 开发前的设计,Android之内存泄漏调试学习与总结
Android 开发前的设计,Android之内存泄漏调试学习与总结
|
2月前
|
前端开发 Android开发
Android架构组件JetPack之DataBinding玩转MVVM开发实战(四)
Android架构组件JetPack之DataBinding玩转MVVM开发实战(四)
Android架构组件JetPack之DataBinding玩转MVVM开发实战(四)