`

ContentProvider(内容提供者)用法 2011.9.4

 
阅读更多


1、 ContentProvider简介

ContentProvider是不同应用程序之间进行数据交换的标准API,使用它一个程序可以把自己的数据暴露给其他的程序。

ContentProvider以某种Uri的形式对外提供数据,允许其他应用程序访问或修改数据。
外界对数据的操作也就是CRUD操作(In computing, CRUD is an acronym for create, retrieve, update, and delete. )
如果要实现暴露自己的数据的话,除了继承 ContentProvider外,还需要实现以下一些方法:insert(),delete(),update(),query(),getType(),onCreate()。

当外界访问 ContentProvider的数据时,会自动创建 ContentProvider,此时会立即回调 onCreate方法。

ContentProvider是单实例模式的,只会创建一个。


当应用继承ContentProvider类,并重写该类用于提供数据和存储数据的方法 ,就可以向其他应用共享其数据。虽然使用其他方法也可以对外共享数据,但数据访问方式会因数据存储的方式而不同。

如:采用文件方式对外共享数据,需要进行文件操作读写数据;采用sharedpreferences共享数据,需要使用sharedpreferences API读写数据。

而使用ContentProvider共享数据的好处是统一了数据访问方式


2、通过ContentProvider对外共享数据的步骤:

第一步 建立一个类继承ContentProvider并根据重写下面方法(下面的方法并不是都要实现)

public class PersonContentProvider extends ContentProvider{

   public boolean onCreate()

   public Uri insert(Uri uri, ContentValues values)

   public int delete(Uri uri, String selection, String[] selectionArgs)

   public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs)

   public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)

   public String getType(Uri uri)

}

 

第二步 需要在AndroidManifest.xml使用<provider>对该ContentProvider进行配置 ,为了能让其他应用找到该ContentProvider , ContentProvider 采用了authorities(主机名/域名) 对它进行唯一标识。

<manifest .... >

    <application android:icon="@drawable/icon" android:label="@string/app_name">

        <provider android:name=".PersonContentProvider" android:authorities="cn.itcast.provider.personprovider"/>

    </application>

</manifest>

 


注意:一旦应用继承了ContentProvider类,后面我们就会把这个应用称为ContentProvider(内容提供者)。

3、Uri类简介
       Uri代表了要操作的数据,Uri主要包含了两部分信息:1.需要操作的ContentProvider ,2.对ContentProvider中的什么数据进行操作,一个Uri由以下几部分组成:

       1.scheme:ContentProvider(内容提供者)的scheme已经由Android所规定为:content://。
       2.主机名(或Authority):用于唯一标识这个ContentProvider,外部调用者可以根据这个标识来找到它。
       3.路径(path):可以用来表示我们要操作的数据,路径的构建应根据业务而定,如下:
•         要操作contact表中id为10的记录,可以构建这样的路径:/contact/10
•         要操作contact表中id为10的记录的name字段, contact/10/name
•         要操作contact表中的所有记录,可以构建这样的路径:/contact
要操作的数据不一定来自数据库,也可以是文件等他存储方式,如下:
要操作xml文件中contact节点下的name节点,可以构建这样的路径:/contact/name
如果要把一个字符串转换成Uri,可以使用Uri类中的parse()方法,如下:
Uri uri = Uri.parse("content://com.changcheng.provider.contactprovider/contact")
4、UriMatcher、ContentUrist和ContentResolver简介
       因为Uri代表了要操作的数据,所以我们很经常需要解析Uri,并从Uri中获取数据。Android系统提供了两个用于操作Uri的工具类,分别为UriMatcher 和ContentUris 。掌握它们的使用,会便于我们的开发工作。

       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部分

       ContentResolver:当外部应用需要对ContentProvider中的数据进行添加、删除、修改和查询操作时,可以使用 ContentResolver 类来完成,要获取ContentResolver 对象,可以使用Activity提供的getContentResolver()方法。 ContentResolver使用insert、delete、update、query方法,来操作数据。

分享到:
评论

相关推荐

    2011.09.07(4)——— android 跨进程通信之content provider

    本文将详细解析2011年9月7日关于Android跨进程通信之Content Provider的知识点,结合相关源码和实用工具进行阐述。 Content Provider是Android四大组件之一,它扮演着数据管理者的角色,允许不同的应用程序之间共享...

    Android程序研发源码weibo4andriod-2011-01-14.zip

    5. **内容提供者(ContentProvider)**:如果源码中涉及到数据存储,可能会用到ContentProvider,它是应用间共享数据的标准接口。虽然微博数据可能由服务器提供,但在本地缓存数据时,ContentProvider可能会发挥作用...

    Android应用源码之2011华为笔试题.zip

    一个标准的Android应用通常由四大组件构成:Activity(活动)、Service(服务)、BroadcastReceiver(广播接收者)和ContentProvider(内容提供者)。开发者需要理解每个组件的职责和它们之间的交互方式。 1. **...

    Android应用开发培训PPT(中程在线) 2011年 韩超老师

    10. **05_3_内容提供者的使用.pdf** 内容提供者是Android中不同应用程序间数据共享的关键组件。本章讲解了ContentProvider的实现,包括SQLite数据库的使用,以及如何通过Uri查询和修改数据。 通过以上内容,学习...

    最新的Android书籍(Android in Action 2nd)

    9. **通知和服务**:介绍如何使用Notification Manager发送通知,以及后台运行Service的使用方法。 10. **多线程和异步任务**:Android应用开发中如何有效地处理多线程,避免阻塞UI线程,以及使用AsyncTask实现轻量...

    2011android面试题目及其答案大全

    5. **内容提供者ContentProvider**: - 学习ContentProvider的作用,如何与其他应用共享数据。 - 实现自定义ContentProvider,掌握UriMatcher的使用。 6. **Android权限管理**: - 掌握AndroidManifest.xml中...

    Android大师高煥堂_1995_應用框架_經典著作

    9. **AsyncTask**:在Android中处理耗时操作的轻量级机制,书中会介绍如何使用AsyncTask来改善用户体验。 10. **权限管理**:Android系统的权限模型,如何在Manifest文件中声明和处理权限请求。 此外,书中的实例...

    2011Android技术面试

    - **内容提供者(Content Provider)**:用于跨应用数据共享。 #### 7. Activity的启动模式 - **standard**:每次启动都会创建一个新的实例。 - **singleTop**:当Activity位于栈顶时,不再创建新的实例。 - **...

    Android应用开发详解pdf

    3. **Android应用程序结构**:了解Android应用的基本结构至关重要,包括Manifest文件、Activity、Service、BroadcastReceiver和ContentProvider等组件的使用方法。 4. **UI设计**:书中将详细介绍如何使用XML布局...

    Android in Practice(2011)[Android开发系列]

    - **线程基础:**介绍了Android中线程的概念和使用方法。 - **Handler机制:**讲解了如何使用Handler来实现在主线程和其他线程之间的消息传递。 - **异步任务:**介绍了AsyncTask类,这是一种简化多线程操作的有效...

    2011Android技术面试整理附有详细答案 包括百度 新浪 中科软等多家公司笔试面试题

    9. **第三方库的使用**: - **Dagger2**:依赖注入框架,简化对象的创建和依赖关系管理。 - **Butter Knife**:视图绑定库,减少findViewById()的使用。 - **RxJava**:响应式编程库,处理异步操作和事件流。 10...

    android 面试题

    9. **Android Studio与Gradle** - **Android Studio使用**:理解项目结构,使用调试工具,集成第三方库等。 - **Gradle构建系统**:掌握Gradle脚本编写,理解依赖管理和构建过程。 10. **Android新特性** - **...

    Android应用开发揭秘(源码)

    4. **数据存储**:Android提供了多种数据存储方式,包括SharedPreferences、SQLite数据库、ContentProvider等。源码可能包含如何读写数据、管理数据库操作的实例。 5. **BroadcastReceiver**:广播接收器用于监听...

    【eoeAndroid特刊09-14】

    【eoeAndroid特刊】是针对Android开发者的系列专题,主要涵盖了从2011年9月5日之前发布的20期内容。这些特刊深入探讨了Android平台的各种技术和趋势,旨在帮助开发者提升技能,了解最新的Android发展动态。以下是各...

Global site tag (gtag.js) - Google Analytics