设为首页 加入收藏

TOP

ContentProvider和ContentResolver的使用(一)
2019-09-01 23:13:36 】 浏览:54
Tags:ContentProvider ContentResolver 使用

ContentProvider

ContentProvider 在android中的作用是对外共享数据,也就是说你可以通过ContentProvider把应用中的数据共享给其他应用访问,其他应用可以通过ContentProvider 对你应用中的数据进行添删改查。
ContentProvider的就是自定义增删改查接口并暴露出去,让别的应用访问自己的数据。ContentResolver就是按照一定规则访问内容提供者的数据。

ContentProvider对外共享数据步骤:

步骤

1. 定义一个类 继承 ContentProvider
2. 定义匹配规则 uri
3. 通过静态代码块添加匹配规则 
4.在manifest.xml中配置contentProvider.  

 

Uri介绍

uri代表了要操作的数据

上面我们提到了Android提供内容的叫Provider,那么在Android中怎么区分各个Provider?

Uri作为唯一的标识来标识这个Provider。

ContentProvider的scheme为:content://
Authority 用于唯一标识这个ContentProvider,外部调用者可以根据这个标识来找到它。
路径(path)可以用来表示我们要操作的数据,路径的构建应根据业务而定,如下:
要操作file表中id为10的记录,可以构建这样的路径:/file/10
要操作file表中id为10的记录的name字段, file/10/name
要操作file表中的所有记录,可以构建这样的路径:/file

当然要操作的数据可以是数据库,也可以是文件、xml或网络等其他存储方式。

代码示例

public class FileProvider  extends ContentProvider {

    private Context mContext;
    private static final int QUEYSUCESS = 0;
    private static final int INSERTSUCESS = 1;
    //UriMatcher.NO_MATCH表示不匹配任何路径的返回码
    private static UriMatcher mUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);

    private SQLiteDatabase mDb;
    private String mTableName = DbOpenHelper.STUDENT_TABLE_NAME;
    static{
        //注册所有要匹配的uri
        mUriMatcher.addURI("com.itcast.contentp.FileProvider", "query", QUEYSUCESS);
        mUriMatcher.addURI("com.itcast.contentp.FileProvider", "insert", INSERTSUCESS);
    }

    //该方法在其它应用第一次访问它时才会被创建
    @Override
    public boolean onCreate() {        
        mContext = getContext();
        mDb = new DbOpenHelper(mContext).getWritableDatabase();
        return false;
    }

    /**
    *public final Cursor query (Uri uri, String[] projection,String selection,String[] selectionArgs, String sortOrder)
    *projection : 这个参数告诉查询要返回的列(Column)即需要的字段,比如Contacts Provider提供了联系人的ID和联系人的NAME等内容.
    *selection :查询where字句
    *selectionArgs : 查询条件属性值
    *sortOrder :结果排序
    */
    @Override
    public Cursor query(Uri uri, String[] arg1, String arg2, String[] arg3,String arg4) {
        if (mUriMatcher.match(uri)== QUEYSUCESS ) {//uri匹配后进行下面的操作
            Cursor cursor = mDb.query(tableName, arg1, arg2, arg3, null, null, null);
            getContext().getContentResolver().notifyChange(uri, null);
            return cursor;
        }else{
            throw new IllegalArgumentException("match fail");
        }
}
这里只给出部分代码。。。。。。


ContentResolver

使用ContentResolver调用ContentProvider提供的接口,对ContentProvider中的数据进行添加、删除、修改和查询操作时。

可以使用Activity提供的getContentResolver()方法来获取ContentResolver对象。 ContentResolver 类提供了与ContentProvider类相同签名的四个方法:

  • 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)


1.对ContentProvider中的数据进行增删改查

直接看代码:

//uriQuery必须与要查询的ContentProvider中的要操作数据的uri保持一致(btw 这里只给了查询好插入的例子)

ContentValues values = new ContentValues();
Cursor cursor = getContentResolver().query(uriQuery, null, null, null, null);
int count = cursor.getCount(); //获取到一共有多少行
int contact_id = count + 1;

ContentValues nameva lues = new ContentValues();
nameva lues.put("name", name);
nameva lues.put("mime_type", "vnd.android.cur
首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Android之Fragment详解(非原创) 下一篇java.lang.UnsatisfiedLinkError:..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目