`
elena_java
  • 浏览: 35946 次
  • 性别: Icon_minigender_2
  • 来自: 济南
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

自定义ContentProvider

阅读更多

Android是如何实现应用程序之间数据共享的?一个应用程序可以创建自己的数据,这个数据对该应用程序来说是私有的,外界更本看不到,也不知道数据是如何 存储的,或者是使用数据库还是使用文件,还是通过网上获得,这些一切都不重要,重要的是外界可以通过这一套标准及统一的接口和这个程序里的数据打交道,例 如:添加(insert)、删除(delete)、查询(query)、修改(update)。

 

android为我们提供了ContentProvider来实现数据的共享,一个程序如果想让别的程序可以操作自己的数据,就定义自己的ContentProvider,然后在AndroidManifest.xml中注册,其他application可以通过获取ContentResolver通过Uri来操作上一程序的数据。

 

android中的电话本等数据就是通过ContentProvider实现数据共享的,系统中有很多已经存在的共享Uri。我们可以使用ContentResolver通过Uri来操作不同表的数据;如Contacts.People.CONTENT_URI

 

什么是URI?

将其分为A,B,C,D 4个部分:

A:标准前缀,用来说明一个Content Provider控制这些数据,无法改变的;"content://"

B:URI的标识,它定义了是哪个Content Provider提供这些数据。对于第三方应用程序,为了保证URI标识的唯一性,它必须是一个完整的、小写的 类名。这个标识在 元素的 authorities属性中说明:一般是定义该ContentProvider的包.类的名称 ;"content://hx.android.text.myprovider"

C:路径,不知道是不是路径,通俗的讲就是你要操作的数据库中表的名字,或者你也可以自己定义,记得在使用的时候保持一致就ok了;"content://hx.android.text.myprovider/tablename"

D:如果URI中包含表示需要获取的记录的ID;则就返回该id对应的数据,如果没有ID,就表示返回全部; "content://hx.android.text.myprovider/tablename/#" #表示数据id

 

这里主要是说明如何创建自己的ContentProvider,这里有几个常用的类

 

UriMatcher:用于匹配Uri,它的用法如下:

1.首先把你需要匹配Uri路径全部给注册上,如下: //常量UriMatcher.NO_MATCH表示不匹配任何路径的返回码(-1)。 UriMatcher uriMatcher = new UriMatcher(UriMatcher.NO_MATCH); //如果match()方法匹配content://com.changcheng.sqlite.provider.contactprovider/contact路径,返回匹配码为1 uriMatcher.addURI(“com.changcheng.sqlite.provider.contactprovider”, “contact”, 1);//添加需要匹配uri,如果匹配就会返回匹配码 //如果match()方法匹配 content://com.changcheng.sqlite.provider.contactprovider/contact/230路径,返回匹配码为2 uriMatcher.addURI(“com.changcheng.sqlite.provider.contactprovider”, “contact/#”, 2);//#号为通配符

2.注册完需要匹配的Uri后,就可以使用uriMatcher.match(uri)方法对输入的Uri进行匹配,如果匹配就返回匹配码,匹配码是调用addURI()方法传入的第三个参数,假设匹配content://com.changcheng.sqlite.provider.contactprovider/contact路径,返回的匹配码为1。

 

ContentUris:用于获取Uri路径后面的ID部分,它有两个比较实用的方法:

· withAppendedId(uri, id)用于为路径加上ID部分

· parseId(uri)方法用于从路径中获取ID部分

 

其他要用到的类程序中已添加说明 自己写了一个小的测试程序,附在下面有想了解的可以看一下 程序是基于同一个application的。

 

对应自定义ContentProvider的使用找到以下资料:

转自http://blog.chinaunix.net/u3/90973/showart_2161195.html

 

ContentProvider是什么时候创建的,是谁创建的?访问某个应用程序共享的数据,是否需要启动这个应用程序?这个问题在 Android SDK中没有明确说明,但是从数据共享的角度出发,ContentProvider应该是Android在系统启动时就创建了,否则就谈不上数据共享了。 这就要求在AndroidManifest.XML中使用元素明确定义。 可能会有多个程序同时通过ContentResolver访问一个ContentProvider,会不会导致像数据库那样的“脏数 据”?这个问题一方面需要数据库访问的同步,尤其是数据写入的同步,在AndroidManifest.XML中定义ContentProvider的时 候,需要考虑是元素multiprocess属性的值;另外一方面Android在ContentResolver中提供了notifyChange() 接口,在数据改变时会通知其他ContentObserver,这个地方应该使用了观察者模式,在ContentResolver中应该有一些类似 register,unregister的接口。 至此,已经对ContentProvider提供了比较全面的分析,至于如何创建ContentProvider,可通过2种方法:创建一个属于你自己的 ContentProvider或者将你的数据添加到一个已经存在的ContentProvider中,当然前提是有相同数据类型并且有写入 Content provider的权限。

分享到:
评论
1 楼 accelater 2011-04-16  
看了后有很大收获

相关推荐

    Android实现使用自定义ContentProvider共享生词本数据库

    Android高级编程雪梨作业之自定义ContentProvider 将任务01生词本作业中生成的生词本数据库通过自定义ContentProvider的方式,共享给其他应用。 要求如下: (1) 使用自定义SQLiteOpenHelper来管理数据库; (2) 提交...

    Android 之 自定义ContentProvider的使用

    自定义ContentProvider允许开发者创建自己的数据存储解决方案,并与其他应用程序无缝交互。这篇博客将深入探讨如何在Android项目中实现一个自定义的ContentProvider。 1. **理解ContentProvider** ContentProvider...

    自定义contentprovider

    自定义ContentProvider是开发者根据需求创建的,用于暴露自己应用中的数据,让其他应用可以安全地读取或写入这些数据。本篇文章将深入讲解如何创建并使用自定义ContentProvider。 一、ContentProvider概述 ...

    自定义ContentProvider的简单例子

    在这个简单的例子中,我们将探讨如何自定义ContentProvider来实现数据共享。 首先,创建一个ContentProvider需要继承`android.content.ContentProvider`类,并重写其中的关键方法: 1. `onCreate()`: 当...

    Android学习之自定义ContentProvider类

    这是学习ContentProvider的第二个练习。 里面自定义ContentProvider类来与SQLite交互。 大致类容就是:通过ContentProvider,创建自己的.db,操作自己的.db. 代码里有详细的解释

    android 数据库 以及自定义ContentProvider demo

    本示例“android 数据库 以及自定义ContentProvider demo”将带你深入理解这两个概念,并通过实践操作演示如何在Android项目中实现它们。 首先,我们来了解Android数据库。Android系统使用SQLite作为默认的轻量级...

    关于自定义ContentProvider的Demo

    首先,我们来看“自定义ContentProvider”。ContentProvider是Android四大组件之一,它的主要职责是为其他应用提供数据访问接口。自定义ContentProvider通常涉及以下步骤: 1. **创建ContentProvider类**:你需要...

    android 自定义 ContentProvider 以及 ContentResolver

    本文将深入探讨如何自定义ContentProvider和如何有效地使用ContentResolver进行数据操作。 首先,ContentProvider是Android系统中的一种特殊组件,它允许应用程序公开自己的数据,使得其他应用可以通过标准接口进行...

    自定义ContentProvider完成数据交互

    本篇文章将深入探讨如何自定义ContentProvider来实现数据交互。 首先,我们需要了解ContentProvider的基本结构。一个自定义的ContentProvider需要继承自`android.content.ContentProvider`类,并重写其中的关键方法...

    ContentProvider自定义以及使用系统ContentProvider

    本篇文章将深入探讨如何自定义ContentProvider以及如何使用系统提供的ContentProvider。 首先,理解ContentProvider的基本概念至关重要。ContentProvider是Android系统中的一种机制,它封装了对数据的操作,如读取...

    android自定义contentprovider

    本篇将详细讲解如何自定义ContentProvider,以及如何实现对联系人、彩信和通话记录的读取。 一、ContentProvider基础 1. **ContentProvider的结构**:一个ContentProvider类需要继承自`android.content....

    通过SQLiteDatabase实现自定义ContentProvider增删改查

    ********************************************** 通过SQLiteDatabase实现自定义ContentProvider增删改查 *********************************************

    自定义ContentProvider实例

    自定义ContentProvider是开发者根据自身需求创建的数据管理工具,可以实现对私有数据或者特定数据源的访问控制。下面将详细介绍如何创建和使用自定义ContentProvider,以及其在提供数据和读取数据中的作用。 一、...

    Android 自定义ContentProvider简单实例

    Android 自定义ContentProvider简单实例 Android允许我们定义自己的的ContentProvider对象来共享数据,练练手,简单来实现一下。 要使用ContentProvider来操作数据,必须要有保存数据的场所。可以使用文件或SQLite...

Global site tag (gtag.js) - Google Analytics