`
javacode23
  • 浏览: 29263 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

android之ContentResolver与ContentProvider

阅读更多

android中对数据操作包含有:
file, sqlite3, Preferences, ContectResolver与ContentProvider前三种数据操作方式都只是针对本应用内数据,程序不能通过这三种方法去操作别的应用内的数据。
android中提供ContectResolver与ContentProvider来操作别的应用程序的数据。

一、 使用方式
一个应用实现ContentProvider来提供内容给别的应用来操作,
一个应用通过ContentResolver来操作别的应用数据,当然在自己的应用中也可以。
1. ContentResolver的获取
   通过Context类:
  
Java代码
public abstract ContentResolver getContentResolver();  
public abstract ContentResolver getContentResolver();
  
2. ContentResolver常用操作
  
Java代码
//查询:   
public final Cursor query(Uri uri, String[] projection,   
           String selection, String[] selectionArgs, String sortOrder);   
//新增   
public final Uri insert(Uri url, ContentValues values)       
//更新   
public final int update(Uri uri, ContentValues values, String where,   
             String[] selectionArgs)   
//删除   
public final int delete(Uri url, String where, String[] selectionArgs)   
         
//查询:
public final Cursor query(Uri uri, String[] projection,
          String selection, String[] selectionArgs, String sortOrder);
//新增
public final Uri insert(Uri url, ContentValues values)   
//更新
public final int update(Uri uri, ContentValues values, String where,
            String[] selectionArgs)
//删除
public final int delete(Uri url, String where, String[] selectionArgs)
       以上操作实际是通过Uri来匹配ContentProvider, 再由ContentProvider来进行具体操作的。
       操作的参数和操作sqlite各函数的参数意义是一样的。
      
二、实现ContentProvider提供给外界访问
调用者ContentResoler是通过一个Uri来找到相应的ContentProvider的来进行实际操作。
     1. Uri概念
        一个Uri的样子如:
     
Java代码
scheme://authorities/path/id  
scheme://authorities/path/id
       如电话记录:
      
Java代码
public static final Uri CONTENT_URI = Uri.parse("content://call_log/calls");  
public static final Uri CONTENT_URI = Uri.parse("content://call_log/calls");
       a.根据scheme不同调用不程序来处理, 常用的:content, android_resource, file, http等
       b.authorities是provider定义的,在AndroidManifest.xml中定义
       c.path和id就好理解的。
    
     2. Uri定义
       创建自己的Uri, 如:
      
Java代码
content://com.shguo.statistic/sms  
content://com.shguo.statistic/sms
       一般数据中都有dir和item两种(当然可定义多个)。为ContentProvider创建息的UriMatcher并添加这两者:
      
Java代码
String AUTHORITY = "com.shguo.statistics";   
UriMatcher sUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);   
sUriMatcher.addURI(AUTHORITY, "sms",   SMS_DIR);   //SMS_DIR = 1   
sUriMatcher.addURI(AUTHORITY, "sms/#", SMS_ITEM); //SMS_ITEM = 2  
String AUTHORITY = "com.shguo.statistics";
UriMatcher sUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
sUriMatcher.addURI(AUTHORITY, "sms",  SMS_DIR);   //SMS_DIR = 1
sUriMatcher.addURI(AUTHORITY, "sms/#", SMS_ITEM); //SMS_ITEM = 2
       contentProvider要根据传入uri判断是dir还是item来操作的。
      
Java代码
switch (sUriMatcher.match(uri))   
switch (sUriMatcher.match(uri))
       来分步操作.
      
     3. 定义MIME类型,
      覆盖getType方法:主要是根据uri来返回Provider的MIME类型
    
Java代码
public static final String CONTENT_TYPE = "vnd.android.cursor.dir/vnd.shguo.sms";   
ublic static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/vnd.shguo.sms";  
public static final String CONTENT_TYPE = "vnd.android.cursor.dir/vnd.shguo.sms";
public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/vnd.shguo.sms";
      getType()为:
     
Java代码
switch (sUriMatcher.match(uri)) {   
        case SMS_DIR:   
            return   CONTENT_TYPE;   
        case SMS_ITEM:   
            return CONTENT_ITEM_TYPE;   
        default:   
            throw new IllegalArgumentException("Unknown URI " + uri);   
     }  
switch (sUriMatcher.match(uri)) {
   case SMS_DIR:
    return  CONTENT_TYPE;
   case SMS_ITEM:
    return CONTENT_ITEM_TYPE;
   default:
    throw new IllegalArgumentException("Unknown URI " + uri);
  }
    
     4. 实现query, insert, delete, update四个操作。
       具体的实现可以用sqlite, file等。并根据uri分情况操作。
       a. query时如果是item加查询条件id.
          where = "_ID=" + uri.getPathSegments().get(1)   + (!TextUtils.isEmpty(where) ? " AND (" + where + ')' : "";
          最后要加上
         cursor.setNotificationUri(getContext().getContentResolver(), uri);
       
       b. insert时要求uri只能是dir. 成功之后返回一个加id的uri.
         
Java代码
Uri insertUri = ContentUris.withAppendedId(CONTENT_URI, rowId);  
Uri insertUri = ContentUris.withAppendedId(CONTENT_URI, rowId);
       c. update、delete与query差不多。
         
Java代码
//注意通知注册uri的观察者。   
getContext().getContentResolver().notifyChange(uri, null);  
//注意通知注册uri的观察者。
getContext().getContentResolver().notifyChange(uri, null);
                 
     5. 在AndroidManifest.xml中定义
        provider元素,主要属性有:
      
Java代码
name => ContentProvider类名   
authorities => content type的授权部分   
multiprocess => true允许在每个客户进程中创建provider实例,消除执行IPC的需求。
分享到:
评论
1 楼 lyltiger 2011-02-25  
data

相关推荐

    Android开发ContentResolver与ContentProvider的使用

    ContentResolver是Android框架提供的一个接口,它为应用程序提供了一个统一的接口,用来与ContentProvider进行交互。开发者可以通过ContentResolver查询、插入、更新或删除ContentProvider中的数据,而无需了解具体...

    android之ContentResolver与ContentProvider介绍

    在Android开发中,ContentResolver和ContentProvider是两个至关重要的组件,它们允许不同应用之间安全地共享数据。ContentResolver作为一个接口,提供了统一的方式来访问和操作数据,而ContentProvider则是实现数据...

    ContentProvider和ContentResolver

    ContentProvider是Android四大组件之一,它的主要职责是封装和管理应用中的数据,例如SQLite数据库、文件系统或者其他持久化存储的数据。ContentProvider通过实现一系列标准接口来提供数据访问服务,包括增删查改等...

    Android+Room+ContentProvider

    Room是Google推出的Android架构组件之一,它提供了一个方便的SQL方言支持的抽象层,使得开发者可以更轻松地与SQLite数据库进行交互。Room的优点在于它减少了手动处理SQL语句的需求,同时提供了类型安全的查询和编译...

    android程序间数据的共享(ContentProvider和ContentResolver的使用)

    首先,ContentProvider是Android四大组件之一,它作为数据存储和访问的桥梁,允许不同应用之间共享数据。ContentProvider基于URI(统一资源标识符)来暴露数据,并通过标准的CRUD(创建、读取、更新、删除)操作管理...

    ContentProvider获取系统的图片视频和音频

    在Android系统中,ContentProvider是四大组件之一,它扮演着数据共享的角色,使得不同应用程序之间可以安全地访问和操作彼此的数据。本篇文章将详细讲解如何使用ContentProvider通过ContentResolver来获取系统的图片...

    android 用ContentProvider操作文件

    1. ContentProvider概述:ContentProvider是Android四大组件之一,它的主要职责是管理应用内的数据并提供对外接口,让其他应用能够通过URI(统一资源标识符)来访问这些数据。这对于文件操作来说尤其有用,因为这样...

    android 自定义 ContentProvider 以及 ContentResolver

    ContentResolver是应用程序用来与ContentProvider交互的接口,它隐藏了ContentProvider的具体实现细节,使得数据访问更加简单和统一。使用ContentResolver进行数据操作的基本步骤如下: 1. **获取ContentResolver...

    Android中ContentProvider的示例

    在Android系统中,ContentProvider是四大组件之一,它扮演着数据共享的角色,使得不同应用程序间可以安全地交换数据。本示例将深入讲解如何创建和使用ContentProvider。 首先,我们来理解ContentProvider的基本概念...

    Android应用开发使用ContentProvider以及SQLite实现对数据库的相关操作

    接下来,ContentProvider是Android四大组件之一,它提供了一种标准接口,使得其他应用程序可以访问和修改由ContentProvider管理的数据,无论这些数据是存储在SQLite数据库、文件系统还是网络中。要创建一个...

    Android 之 自定义ContentProvider的使用

    如果ContentProvider与SQLite数据库交互,你需要创建一个SQLiteOpenHelper子类来处理数据库的创建和升级。在`onCreate()`和`onUpgrade()`方法中定义表结构和升级逻辑。 5. **权限管理** 自定义ContentProvider...

    Android中ContentResolver的使用说明.pdf

    在Android系统中,ContentResolver是一个至关重要的组件,它充当了应用程序与ContentProvider之间的桥梁,使得应用能够方便地读取、写入、更新和删除由ContentProvider管理的数据。ContentResolver提供了标准化的API...

    android-关于ContentProvider的使用例子

    在Android开发中,ContentProvider是四大组件之一,它扮演着数据共享的重要角色。ContentProvider使得应用程序之间能够安全、有序地访问彼此的数据,无论是系统内置的数据(如联系人、日历等)还是自定义的数据存储...

    从头学Android之ContentProvider示例源代码

    在Android开发中,ContentProvider是四大组件之一,它充当了数据共享和访问的桥梁,使得不同应用程序之间可以安全地共享数据。本示例源代码旨在帮助初学者理解ContentProvider的工作原理及其使用方法。通过分析和...

    Android四大组件之ContentProvider(二)

    在Android应用开发中,四大组件是Activity、Service、...通过阅读《Android四大组件之ContentProvider(二)》这篇博客,开发者可以更深入地了解ContentProvider的工作原理和实践技巧,从而在实际项目中灵活运用。

    Android第八章ContentProvider

    五、ContentProvider与SQLite数据库的结合 很多情况下,ContentProvider会与SQLite数据库配合使用,将数据存储在SQLite数据库中。ContentProvider的insert、query、update和delete方法会对应到SQLite数据库的相应...

    Android ContentProvider简单实现

    在Android开发中,ContentProvider是四大组件之一,它充当了数据共享的桥梁,使得不同的应用程序之间可以安全地访问和共享数据。本篇文章将详细介绍如何在Android中实现一个简单的ContentProvider。 首先,理解...

    android 数据共享(ContentProvider)

    这个Uri是ContentProvider与外界交互的入口,通常由两部分组成:authority(权限名)和path(路径)。Authority是ContentProvider的唯一标识,通常设置为应用的包名,而path则用于指定数据的特定类型或子集。 接...

    androdi ContentProvider和Uri详解

    TestCP可能是本次讲解的一个实践示例或者测试用例,它可能包含了一个简单的ContentProvider实现和相关的测试代码,帮助开发者理解和掌握ContentProvider与Uri的使用。 总结起来,Android的ContentProvider和Uri是...

Global site tag (gtag.js) - Google Analytics