基础总结篇之八:创建及调用自己的ContentProvider

阅读:273 2019-03-19 14:41:07 来源:新网

鍥而捨之,朽木不折;鍥而不捨,金石可鏤。戰國.荀子《勸學篇》

若不能坚持到底,即使是朽木也不能折断;只要坚持不停地用刀刻,就算是金属玉石也可以雕出花饰。用今天的话来说就是:再容易的事情,没有锲而不舍的精神,都不可能做到;再难的事情,只要有坚持不懈的努力,都一定能够做到。希望我们在坚持理想的道路上都能够锲而不舍地雕刻自己的那块“金石”。

今天我们来讲解一下如何创建及调用自己的contentprovider。

在前面两篇文章中我们分别讲了如何读写联系人和短消息,相信大家对于contentprovider的操作方法已经有了一定程度的了解。在有些场合,除了操作contentprovider之外,我们还有可能需要创建自己的contentprovider,来提供信息共享的服务,这就要求我们很好的掌握contentprovider的创建及使用技巧。下面我们就由表及里的逐步讲解每个步骤。

在正式开始实例演示之前,我们先来了解以下两个知识点:

授权:

在android中,每一个contentprovider都会用类似于域名的字符串来注册自己,我们成为授权(authority)。这个唯一标识的字符串是此contentprovider可提供的一组uri的基础,有了这个基础,才能够向外界提供信息的共享服务。

授权是在androidmanifest.xml中完成的,每一个contentprovider必须在此声明并授权,方式如下:

mime类型:

就像网站返回给定url的mime(multipurposeinternetmailextensions,多用途internet邮件扩展)类型一样(这使浏览器能够用正确的程序来查看内容),contentprovider还负责返回给定uri的mime类型。根据mime类型规范,mime类型包含两部分:类型和子类型。例如:text/html,text/css,text/xml等等。

android也遵循类似的约定来定义mime类型。

对于单条记录,mime类型类似于:

vnd.android.cursor.item/vnd.your-company.content-type

而对于记录的集合,mime类型类似于:

vnd.android.cursor.dir/vnd.your-company.comtent-type

其中的vnd表示这些类型和子类型具有非标准的、供应商特定的形式;content-type可以根据contentprovider的功能来定,比如日记的contentprovider可以为note,日程安排的contentprovider可以为schedule,等等。

了解了以上两个知识点之后,我们就结合实例来演示一下具体的过程。

我们将会创建一个记录person信息的contentprovider,实现对person的crud操作,访问者可以通过下面路径操作我们的contentprovider:

访问者可以通过“[base_uri]/persons”来操作person集合,也可以通过“[base_uri]/persons/#”的形式操作单个person。

我们创建一个person的contentprovider需要两个步骤:

1.创建personprovider类:

我们需要继承contentprovider类,实现oncreate、query、insert、update、delete和gettype这几个方法。具体代码如下:

在我们的personprovider中,我们用到了person、dbhelper类,代码如下:

最后,要想让这个contentprovider生效,我们需要在androidmanifest.xml中声明并为其授权,如下所示:

其中,android:multiprocess代表是否允许多进程操作。另外我们也可以为其声明相应的权限,对应的属性是:android:permission。

2.调用personprovider类:

完成了person的contentprovider后,下面我们来看一下如何访问它。这一步我们在mainactivity中完成,看下面代码:

在前面的personprovider我们也提到,在数据更改后,会向指定的uri访问者发出通知,以便于更新查询记录。大家注意,仅仅是contentprovider出力还不够,我们还需要在访问者中注册一个contentobserver,才能够接收到这个通知。下面我们创建一个personobserver:

最后,我们要在androidmanifest.xml中为mainactivity添加mime类型过滤器,告诉系统mainactivity可以处理的信息类型:

相关文章
{{ v.title }}
{{ v.description||(cleanHtml(v.content)).substr(0,100)+'···' }}
你可能感兴趣
推荐阅读 更多>
推荐商标

{{ v.name }}

{{ v.cls }}类

立即购买 联系客服