Android——访问其他程序中的数据之创建自己的内容提供器

首先我们先新建MyProvider继承字ContentProvider
public class MyProvider extends ContentProvider {
    @Override
    public boolean onCreate() {//初始化内容提供器,完成对数据库的创建和升级等操作,返回true则初始化成功,返回false则初始化失败,只有当存在ContentReslover尝试访问我们程序的时候才会初始化
        return false;
    }
//在内容提供器中查询数据,使用uri参数来确定查询哪张表,projection参数用于确定查询那些列,selection和selectionArgs参数用于约束查询哪些行,sortOrder参数用于对结果进行排序,查询的结果存放在Cursor对象中返回。
    @Nullable
    @Override
    public Cursor query(@NonNull Uri uri, @Nullable String[] projection, @Nullable String selection, @Nullable String[] selectionArgs, @Nullable String sortOrder) {
        return null;
    }
//向内容中添加一条数据,使用uri参数来确定要添加到的表,待添加的数据灿存在values参数中。添加完成后,返回一个用于表述这条新记录的URI
    @Nullable
    @Override
    public Uri insert(@NonNull Uri uri, @Nullable ContentValues values) {
        return null;
    }
//更新内容提供器中已有数据,使用uri参数来确定更新哪张表中的数据。新数据保存在values参数中
    @Override
    public int update(@NonNull Uri uri, @Nullable ContentValues values, @Nullable String selection, @Nullable String[] selectionArgs) {
        return 0;
    }
//从内容提供器中删除数据,使用uri来确定删除哪张表中的数据,selection和selectionArgs参数用于约束删除哪些行,被删除的行数将作为返回值返回
    @Override
    public int delete(@NonNull Uri uri, @Nullable String selection, @Nullable String[] selectionArgs) {
        return 0;
    }
//根据传入的内容URI,来返回相应的MUME类型
    @Nullable
    @Override
    public String getType(@NonNull Uri uri) {
        return null;
    }
}

onCreate()

初始化内容提供器,完成对数据库的创建和升级等操作,返回true则初始化成功,返回false则初始化失败,只有当存在ContentReslover尝试访问我们程序的时候才会初始化

query()

在内容提供器中查询数据,使用uri参数来确定查询哪张表,projection参数用于确定查询那些列,selectionselectionArgs参数用于约束查询哪些行,sortOrder参数用于对结果进行排序,查询的结果存放在Cursor对象中返回。

insert()

向内容中添加一条数据,使用uri参数来确定要添加到的表,待添加的数据存在values参数中。添加完成后,返回一个用于表述这条新记录的URI

update()

更新内容提供器中已有数据,使用uri参数来确定更新哪张表中的数据。新数据保存在values参数中

delete()

从内容提供器中删除数据,使用uri来确定删除哪张表中的数据,selectionselectionArgs参数用于约束删除哪些行,被删除的行数将作为返回值返回

getType()

根据传入的内容URI,来返回相应的MUME类型

一个比准的内容URI写法是这样的:

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

这就表示调用方期望访问的是com.example.app这个应用的table1表中的数据。除此之外,我们还可以在这个内容URI的后面加上一个id,如下所示:

content://com.example.app.provider/table1/1

这就表示调用方期望访问的是com.example.app这个应用的table1表中id为1的数据

内容URI的格式主要就只有以上两种,以路径结尾就表示期望访问该表中所有的数据,以id结尾就表示期望访问该表中拥有对应id的数据。我们可以使用通配符的方式来分别匹配这两种格式的URI

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

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

eg:content://com.example.app.provider/*

      content://com.example.app.provider/table1/#

我们在借助UriMatcher这个类就可以轻松的实现匹配内容URI的功能。其中提供了addURI()的方法,可以把authority、path和一个自定义代码穿进去,这样,当调用UriMatcher的match()方法时,就可以讲一个Uri对象传入,返回值是某个能够匹配这个Uri对象所对应的自定义代码,利用这个代码,我们就可以判断出调用方期望访问的是哪张表中的数据了。

我们添加如下代码:

public static final int TABLE1_DIR=0;

    public static final int TABLE1_ITEM=1;

    public static final int TABLE2_DIR=2;

    public static final int TABLE2_ITEM=3;

    private static UriMatcher uriMatcher;

    static {
        uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
        uriMatcher.addURI("com.wangkangli.myprovider.provider","table1",TABLE1_DIR);
        uriMatcher.addURI("com.wangkangli.myprovider.provider","table1/#",TABLE1_ITEM);
        uriMatcher.addURI("com.wangkangli.myprovider.provider","table2",TABLE2_DIR);
        uriMatcher.addURI("com.wangkangli.myprovider.provider","table2/#",TABLE2_ITEM);
    }
    @Override
    public boolean onCreate() {
        return false;
    }
 @Nullable
    @Override
    public Cursor query(@NonNull Uri uri, @Nullable String[] projection, @Nullable String selection, @Nullable String[] selectionArgs, @Nullable String sortOrder) {
     switch (uriMatcher.match(uri)){
         case TABLE1_DIR:
         //查询table1表中所有数据
             break;
         case TABLE1_ITEM:
             break;;
         case TABLE2_DIR:
             break;
         case TABLE2_ITEM:
             break;
     }
 }

只是用query为例子做了个示范。

另外getType()方法,是所有内容提供器必须提供的一个方法,用于获取Uri对象所对应的MIME类型。一个内容URI所对应的MIME字符串主要有三部分组成

1、必须以vnd开头

2、如果内容URI以路径结尾,则后接android.cursor.dir/,如果内容以id结尾,则后接android.cursor.item/

3、最后接上vnd.<authority>.<path>

所以可以写成

vnd.android.cursor.dir/vnd.com.example.app.provider.table1

vnd.android.cursor.item/vnd.com.example.app.provider.table1

public String getType(@NonNull Uri uri) {
        switch (uriMatcher.match(uri)){
            case TABLE1_DIR:
                return "vnd.android.cursor.dir/vnd.com.example.app.provider.table1";
            case TABLE1_ITEM:
                return "vnd.android.cursor.item/vnd.com.example.app.provider.table1";
            case TABLE2_DIR:
                return "vnd.android.cursor.dir/vnd.com.example.app.provider.table2";
            case TABLE2_ITEM:
                return "vnd.android.cursor.item/vnd.com.example.app.provider.table2";
            default:break;
        }
        return null;
    }
于是就完成了。




    


猜你喜欢

转载自blog.csdn.net/castanea/article/details/80423375
今日推荐