分享免费的编程资源和教程

网站首页 > 技术教程 正文

Android世界:初识ContentProvider

goqiw 2024-09-16 19:21:09 技术教程 28 ℃ 0 评论

本想如上篇文章开头所述,写两篇跨进程访问的Binder、AIDL、ContentProvider即可。但,Google对用户个人数据的严苛保护,不得不让我们重新开始学习、使用ContentProvider。此文是ContentProvider的大框架介绍,如您功力深厚、天赋异禀,则可忽视此文。

ContentProvider的具体使用方式,会在下篇文章进行介绍。


一、ContentProvider

内容提供商是Android应用程序的主要构建块之一,是应用程序间数据共享的接口机制。ContentProvider封装数据并通过ContentResolver接口将数据提供给应用程序,只有在需要在多个应用程序之间共享数据时,才需要内容提供者(谷歌官宣)。当然,也可以自定义一个进程内的ContentProvider,但实际意义不大(可在博客中搜寻)。

例如,联系人数据由多个应用程序使用,并且必须存储在内容提供者中。如果您不需要在多个应用程序之间共享数据,则可以通过SQLiteDatabase直接使用数据库。

当通过ContentResolver发出请求时,系统会检查给定URI的权限,并将请求传递给已经在Manifest中注册的内容提供者。内容提供者可以解析它想要的URI的其余部分。 UriMatcher类有助于解析URI。

标准API介绍--中英文对照版


二、ContentResolver

提供接口管理ContentProvider,便于对多个ContentProvider进行管理、操作;通过getContentResolver()获取对象,并根据Uri对应用的数据进行CRUD操作。

标准API介绍--中英文对照版


三、URI

统一资源标识符,Uniform Resource Identifier,是一个用于标识某一互联网资源名称的字符串。 该种标识允许用户对任何(包括本地和互联网)的资源通过特定的协议进行交互操作。

Android的ContentProvider机制中,ContentResolver 对象通过Uri定位至应用程序需要访问的资源,并由UriMatcher对Uri进行解析,获取数据。

标准API介绍--中英文对照版

格式

Uri主要包含了两部分信息:

1、需要操作的ContentProvider--由授权信息决定

2、对ContentProvider中的什么数据进行操作--由path决定

一个Uri由以下几部分组成:

安卓中ContentProvider的scheme已经被指定为“content://”;

Authority 授权信息(或 主机名)用于唯一标识这个ContentProvider,外部调用者可以根据这个标识来找到它;

路径(path)可以用来表示我们要操作的数据;

路径的构建应根据业务而定,如下:

要操作person表中id为10的记录,可以构建这样的路径:/person/10

要操作person表中id为10的记录的name字段, person/10/name

要操作person表中的所有记录,可以构建这样的路径:/person

要操作xxx表中的记录,可以构建这样的路径:/xxx

当然要操作的数据不一定来自数据库,也可以是文件、xml或网络等其他存储方式,如下:

要操作xml文件中person节点下的name节点,可以构建这样的路径:/person/name

如果要把一个字符串转换成Uri,可以使用Uri类中的parse()方法,如下:

Uri uri = Uri.parse("content://com.ljq.provider.personprovider/person")

习自:http://www.cnblogs.com/linjiqin/archive/2011/05/28/2061396.html


四、UriMatcher

Uri的匹配工具类,本质上是一个文本过滤器,用在contentProvider中帮助我们过滤,分辨出查询者想要查询哪个数据表。

标准API介绍--中英文对照版


五、ContentUris

Android中对Uri进行直接操作的工具类,主要是拼接Uri字符串用。

标准API介绍--中英文对照版

例如:

Uri uri = Uri.parse("content://com.lzb.provide.myContentProvide:200/students");

Uri newUri = ContentUris.withAppendedId(uri,2);

那么 newUri 就变成了content://com.lzb.provide.myContentProvide:200/students/2。

public static long parseId(Uri uri) 用于从指定的Uri中解析出所包含的id

原文:https://blog.csdn.net/lu1024188315/article/details/78303467


六、ContentObserver

监听ContentProvider提供的Uri的数据是否发生变化,当发生改变时,提供回调接口onChange()以供业务操作。

标准API介绍--中英文对照版


七、ContentProvider 框架图

原文:https://blog.csdn.net/yhaolpz/article/details/51304345

ContentProvider完全屏蔽了底层数据源的数据存储方法。数据提供者通过ContentProvider提供了一组标准的数据操作接口,但却无须知道数据提供者的内部数据的存储方法。

数据提供者可以使用SQLite数据库存储数据,也可以通过文件系统或SharedPreferences存储数据,甚至是使用网络存储的方法,这些数据的存储方法和存储设备对数据使用者都是不可见的。

同时,也正是这种屏蔽模式,很大程度上简化了ContentProvider的使用方法,使用者只要调用ContentProvider提供的接口函数,即可完成所有的数据操作,而数据存储方法则是ContentProvider设计者需要考虑的问题。

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表