当前位置: 移动技术网 > IT编程>移动开发>Android > android之ContentResolver与ContentProvider介绍

android之ContentResolver与ContentProvider介绍

2019年07月24日  | 移动技术网IT编程  | 我要评论

汽车降价排行榜,百万亚瑟王阵营选择,朱罗世纪公园

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的需求。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网