欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

android之ContentResolver与ContentProvider介绍

程序员文章站 2024-02-18 11:59:46
android中对数据操作包含有: file, sqlite3, preferences, contectresolver与contentprovider前三种数据操作...

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

一、 使用方式

一个应用实现contentprovider来提供内容给别的应用来操作,
一个应用通过contentresolver来操作别的应用数据,当然在自己的应用中也可以。

1. contentresolver的获取

通过context类:
 

复制代码 代码如下:

public abstract contentresolver getcontentresolver(); 

  
2. contentresolver常用操作

复制代码 代码如下:

//查询:  
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的样子如:

复制代码 代码如下:

scheme://authorities/path/id 

       如电话记录:
     

复制代码 代码如下:

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, 如:

复制代码 代码如下:
     
content://com.shguo.statistic/sms 

       一般数据中都有dir和item两种(当然可定义多个)。为contentprovider创建息的urimatcher并添加这两者:

复制代码 代码如下:

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来操作的。
     

复制代码 代码如下:

switch (surimatcher.match(uri))  

来分步操作.
      
3. 定义mime类型,
      覆盖gettype方法:主要是根据uri来返回provider的mime类型
   

复制代码 代码如下:

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"; 

 gettype()为: 
    

复制代码 代码如下:

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.
        

复制代码 代码如下:

uri inserturi = contenturis.withappendedid(content_uri, rowid); 

       c. update、delete与query差不多。
        

复制代码 代码如下:

//注意通知注册uri的观察者。  
getcontext().getcontentresolver().notifychange(uri, null); 

                 
5. 在androidmanifest.xml中定义
        provider元素,主要属性有:
     
复制代码 代码如下:

name => contentprovider类名  
authorities => content type的授权部分  
multiprocess => true允许在每个客户进程中创建provider实例,消除执行ipc的需求。