ContentProvider使用简介

原文出处:http://www.ccbu.cc/index.php/android/android-contentprovider.html

ContentProvider中文名“内容提供者”,是Android系统不同应用程序之间进行数据交换的标准API,ContentProvide以Uri的形式对外提供数据,允许其他应用访问和修改数据;其他应用使用ContentResolve根据Uri进行访问操作指定的数据。Android内置的许多数据也都是使用ContentProvider形式,供开发者调用的;如视频,音频,图片,通讯录等。

统一资源标识符(URI)

访问ContentProvider都是统一通过Uri进行访问的,URI(Uniform Resource Identifier,即统一资源标识符)由三部分组成,即协议(scheme),所有者(authority),路径(path)。

在ContentProvider中,scheme统一为content:// ;authority用来作为当前Provider的唯一标识,一般以公司域名+数据标识; Path为具体的数据路径,一般为 “数据类型 / 数据ID” 的形式 。如上面例子中的100即为id。

UriMatcher类

既然ContentProvider需要通过RUI进行访问,所以android系统提供了UriMatcher来进行Uri的匹配处理。提供了以下两个接口,一个用来添加匹配规则,一个用来获取匹配结果。

public void addURI(String authority, String path, int code)
public int match(Uri uri)  

定义匹配规则

public static final int ID1 = 1;
public static final int ID2 = 2;
public static final String HOST = "com.test.provider.DataContentProvider";
public static final String PATH = "students";
private static UriMatcher uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
static {
      
    uriMatcher.addURI(HOST,PATH, ID1);   
    uriMatcher.addURI(HOST,PATH + "/#", ID2); // # 为通配符 
}

匹配路径

switch (uriMatcher.match(Uri uri)) {
    
   case ID1:
     break;
   case ID2:
     break;
   default:
     break;
}

如匹配的uri为:content://com.test.provider.DataContentProvider/students/10 , 则得到的匹配码为ID2。

ContentUris类

这个类是一个操作Uri字符串的工具类,主要是拼接Uri字符串用,它有两个方法:

public static  Uri withAppendedId(Uri uri, long  id)   // 用于为路径加上id部分
public static long parseId(Uri uri)   // 用于从指定的Uri中解析出所包含的id
Uri  uri = Uri.parse("content://com.test.provider.DataContentProvider/students");
Uri newUri = ContentUris.withAppendedId(uri, 100);
Uri uri = Uri.parse("content://com.test.provider.DataContentProvider/students/100")
long personid = ContentUris.parseId(uri); // 获取的结果为:100

ContentProvider类介绍

ContentProvider类是一个抽象类,具体的实现类需要实现其主要的几个虚函数,也正是通过这些虚函数的实现来完成具体的ContentProvider的具体功能的。主要的函数如下:

函数 说明
boolean onCreate() ContentProvider创建后就会被调用,ContentProvider在其它应用第一次访问它时才会被创建
Cursor query(Uri uri, String[] projection, String selection,String[] selectionArgs, String sortOrder) 用于供外部应用从ContentProvider中获取数据
String getType(Uri uri) 用于返回当前Url所代表数据的MIME类型
Uri insert(Uri uri, ContentValues values) 用于供外部应用往ContentProvider添加数据
int delete(Uri uri, String selection, String[] selectionArgs) 用于供外部应用从ContentProvider删除数据
int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) 用于供外部应用更新ContentProvider中的数据

下面通过一个实列来展示ContentProvider的实现。

public class StudentProvider extends ContentProvider {
   

    public static final int TYPE_ITEM = 1;
    public static final int TYPE_TABLE = 2;
    public static final String HOST = "cc.ccbu.provider.StudentProvider";
    public static final String PATH = "students";
    private static UriMatcher uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
    public static final String CONTENT_TYPE_ITEM = "vnd.android.cursor.dir/students.item";
    public static final String CONTENT_TYPE_TABLE = "vnd.android.cursor.item/students.table";
    static {
   
        uriMatcher.addURI(HOST, PATH, TYPE_TABLE);
        uriMatcher.addURI(HOST,PATH 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值