敲哭的博客

自我记录

ContentProvider简单使用

1.两种用途:

一是使用内容提供器读取和操作其他应用程序的数据

二是创建内容提供器给该程序的数据提供外部访问接口

2.举例

如电话簿,短信,媒体库,都有内容提供器让它们的数据有外部访问接口

3.一个应用程序通过内容内容提供器对其数据提供外部接口,那其他应用程序可以对这部分数据进行访问。

内容提供器提供的数据外部访问接口是一个uri.它由authority和path组成

authority用不同程序的包名做区分 如:com.example.mytestapp.provider

path相当于不同的表加在authority的后面。如有表table1,table2

则uri为:com.example.mytestapp.provider/tabler1 和 com.example.mytestapp.provider/tabler2

然后还要加上协议声明:所以标准的内容uri格式如下:

content://com.example.mytestapp.provider/table1

content://com.example.mytestapp.provider/table2

上面的只是字符对象,要转化成uri对象:

Uri uri = Uri.parse("content://com.example.mytestapp.provider/table1");

4.如果其它程序想要访问【这个程序(mytestapp)对外提供的数据】:操作如下:(查询)

Cursor cursor = getContentResolver().query(
                uri,
                projection, //字段名,列名,column1,column2
                selection, //查询条件 where column = value(?)占位符
                value, //占位符具体的值
                sortOrder //排序方式, 例如 order by column1
        );
if (cursor != null) {
            while(cursor.moveToNext()){ //cursor是游历每一行
                String column1 = cursor.getString(cursor.getColumnIndex("culomn1")); //得到该行的某个字段的值
            }
            cursor.close();
        }

添加:

ContentValues values = new ContentValues();
        values.put("column1" , "text");
        values.put("colum2" , 2);
        getContentResolver().insert(uri , values);

更新:

ContentValues values = new ContentValues(); //更新之后的新值
        values.put("column1" , "1"); //更新之后的新值
        values.put("colum2" , 0); //更新之后的新值
        //根据条件将 新值替换掉旧值
        getContentResolver().insert(uri , values , "column1 = ? and column2 = ?" , new String[]{"text" , "2"});

删除:

//根据条件删除某条数据
        getContentResolver().delete(uri , "column2 = ?" , new String[]{"2"});

其他:

手机联系人的uri: 

ContactsContract.CommonDataKinds.Phone.CONTENT_URI

提供的字段有 name 和 手机号

ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME
ContactsContract.CommonDataKinds.Phone.NUMBER

想要获取name 和 手机号,需要加权限,还要动态申请权限

READ_CONTACTS

5.为自己的应用程序创建一个内容提供器,对相应数据提供外部访问接口,让其它程序可以访问
上面的都是自己的程序用接口uri访问其它程序提供的数据。

两个常用uri如下:

* : 表示匹配任意长度的任意字符

# : 表示匹配任意长度的数字

一个能够匹配任意表的内容uri: content://com.example.mytestapp.provider/*

一个能够匹配表table1中任意一行数据的uri : content://com.example.mytestapp.provider/table1/#

一个完整的例子如下:

<provider
            android:name=".MyContentProvider"
            android:authorities="com.example.liuyan.testcontentprovider.provider"
            android:enabled="true"
            android:exported="true"></provider>
public class MyContentProvider extends ContentProvider {

    public static final String AUTHORITY = "com.example.liuyan.testcontentprovider.provider";
    private static UriMatcher uriMatcher; //用于做uri匹配判断的
    static {
        uriMatcher = new UriMatcher(UriMatcher.NO_MATCH); //先把要用的uri 加进去,方便后面做匹配
        uriMatcher.addURI(AUTHORITY , "book" , 0); //第一个参数为表名,第二个参数为matcher的区分各uri的标号
        uriMatcher.addURI(AUTHORITY , "book/#" , 2);//第一个参数为表的具体一行
    }

    private MyDatabaseHelper dbhelper; //自己应用程序的sqlite帮助类

    public MyContentProvider() {
    }

    @Override
    public boolean onCreate() {
        dbhelper = new MyDatabaseHelper(getContext() , "Book.db" , null , 1);
        return true;
    }

    @Override
    public Cursor query(Uri uri, String[] projection, String selection,
                        String[] selectionArgs, String sortOrder) {
        SQLiteDatabase db = dbhelper.getReadableDatabase(); //该应用程序的sqlite数据库
        Cursor cursor = null;
        switch (uriMatcher.match(uri)){
            case 0 :
                cursor = db.query("Book" , projection , selection , selectionArgs , null , null , sortOrder);
                break;
            case 2 :
                String bookid = uri.getPathSegments().get(1);
                cursor = db.query("Book" , projection , "id = ?" , new String[]{bookid} , null , null , sortOrder);
                break;
            default:
                break;
        }


        return cursor;
    }

    @Override
    public Uri insert(Uri uri, ContentValues values) {
        SQLiteDatabase db = dbhelper.getReadableDatabase();
        Uri urireturn = null;
        switch (uriMatcher.match(uri)){
            case 0 :
            case 2 :
                long newbookid = db.insert("Book" , null , values);
                urireturn = Uri.parse("content://" + AUTHORITY + "/book/" + newbookid);
                break;
            default:
                break;
        }

        return urireturn;
    }

    @Override
    public int update(Uri uri, ContentValues values, String selection,
                      String[] selectionArgs) {
        SQLiteDatabase db = dbhelper.getReadableDatabase();
        int updateids = 0;
        switch (uriMatcher.match(uri)){
            case 0 :
                updateids = db.update("Book" , values , selection , selectionArgs);
                break;
            case 2 :
                String bookid = uri.getPathSegments().get(1);
                updateids = db.update("Book" , values , "id = ?" , new String[] {bookid});
                break;
            default:
                break;
        }

        return updateids;
    }

    @Override
    public int delete(Uri uri, String selection, String[] selectionArgs) {
        SQLiteDatabase db = dbhelper.getReadableDatabase();
        int deleteids = 0;
        switch (uriMatcher.match(uri)){
            case 0 :
                deleteids = db.delete("Book" , selection , selectionArgs);
                break;
            case 2 :
                String bookid = uri.getPathSegments().get(1);
                deleteids = db.delete("Book" , "id = ?" , new String[]{bookid});
                break;
            default:
                break;
        }

        return deleteids;
    }

    @Override
    public String getType(Uri uri) {
        switch (uriMatcher.match(uri)){
            case 0 :
                return "vnd.android.cursor.dir/vnd.com.example.liuyan.testcontentprovider.provider.book";
            case 2:
                return "vnd.android.cursor.item/vnd.com.example.liuyan.testcontentprovider.provider.book";
            default:
                break;
        }
        return null;
    }


}

理解代码:

public class MyProvider extends ContentProvider {
    @Override
    public boolean onCreate() { //初始化,完成创建和升级的操作,返回true表示成功,只有ContentResolver访问时,内容提供器才会初始化
        return false;
    }

    @Nullable
    @Override
    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
        //ContentResolver访问查询时,uri参数用来去顶操作哪张表,之后的参数分别表示:字段名(列),约束条件,条件的值,排序

        return null;
    }

    @Nullable
    @Override
    public String getType(Uri uri) {
        //返回uri的MIME字符串。必须以vnd开头,如果以路径结尾,后加android.cursor.dir/
        //如果以id结尾,则后接android.cursor.item/
        //最后加上vnd.<authority>.<path>

        return null;
    }

    @Nullable
    @Override
    public Uri insert(Uri uri, ContentValues values) {
        //ContentResolver访问查询时,uri参数用来去顶操作哪张表,数据在values中
        //该方法返回新纪录的uri 如:content://com.example.mytestapp.provider/table1/id

        return null;
    }

    @Override
    public int delete(Uri uri, String selection, String[] selectionArgs) {
        //ContentResolver访问查询时,后两个参数是:约束条件,条件值
        //该方法返回删除行的行数

        return 0;
    }

    @Override
    public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
        //ContentResolver访问查询时,uri参数用来去顶操作哪张表,新数据在values中,后两个参数是:约束条件,条件值
        //该方法返回更新行的行数

        return 0;
    }
}





阅读更多
上一篇IntentService
下一篇读取assets目录下的图片文件
想对作者说点什么? 我来说一句

内容提供者示例DEMO

2017年11月17日 209KB 下载

sqlite&provider&observer

2015年02月04日 7KB 下载

Android四种存储方式

2017年11月17日 127KB 下载

ContentProvider概述

2009年04月19日 28KB 下载

没有更多推荐了,返回首页

关闭
关闭