《第一行代码》阅读笔记 (5)

2016-06-07  本文已影响0人  fuxianrui

一、内容提供器简介

内容提供器(Content Provider)主要用于在不同的应用程序之间实现数据共享的功能,它提供了一套完整的机制, 允许一个程序访问另一个程序中的数据, 同时还能保证被访数据的安全性。目前,使用内容提供器是Android实现跨程序共享数据的标准方式。

不同于文件存储和SharedPreferences存储中的两种全局可读写操作模式, 内容提供器可以选择只对哪一部分数据进行共享,从而保证我们程序中的隐私数据不会有泄漏的风险。

二、访问其他程序中的数据

1.ContentResolver的基本用法

ContentResolver中提供了一系列的方法用于对数据进行CRUD操作,其中insert()方法用于添加数据,update()方法用于更新数据,delete()方法用于删除数据,query()方法用于查询数据。

内容uri:

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

查询:
Cursor cursor = getContentResolver().query(uri,projection,selection,selectionArgs,sortOrder);
if (cursor != null) {
    while (cursor.moveToNext()) {
        String column1 = cursor.getString(cursor.getColumnIndex("column1"));
        int column2 = cursor.getInt(cursor.getColumnIndex("column2"));
    }
    cursor.close();
}

增加:

ContentValues values = new ContentValues();

values.put("column1", "text");

values.put("column2", 1);

getContentResolver().insert(uri, values);

更新:

ContentValues values = new ContentValues();

values.put("column1", "");

getContentResolver().update(uri, values, "column1 = ? and column2 = ?", new String[] {"text", "1"});

删除:

getContentResolver().delete(uri, "column2 = ?", new String[] { "1" });

三、创建自己的内容提供器

1.创建内容提供器的步骤

通过新建一个类去继承ContentProvider的方式来创建一个自己的内容提供器。ContentProvider类中有六个抽象方法, 我们在使用子类继承它的时候, 需要将这六个方法全部重写。

public class MyProvider extends ContentProvider {

    @Override

    public boolean onCreate() {

        return false;

    }

    @Override

    public Cursor query(Uri uri, String[] projection, String selection,String[]      selectionArgs, String sortOrder) {

        return null;

    }

    @Override

    public Uri insert(Uri uri, ContentValues values) {

        return null;

    }

    @Override

    public int update(Uri uri, ContentValues values, String selection,String[] selectionArgs) {

        return 0;

    }

    @Override

    public int delete(Uri uri, String selection, String[] selectionArgs) {

        return 0;

    }

    @Override

    public String getType(Uri uri) {

        return null;

    }

}


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

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

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

所以,一个能够匹配任意表的内容URI格式就可以写成:

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

而一个能够匹配table1表中任意一行数据的内容URI格式就可以写成:

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

UriMatcher中提供了一个addURI()方法, 这个方法接收三个参数, 可以分别把权限、 路径和一个自定义代码传进去。这样,当调用UriMatcher的match()方法时,就可以将一个Uri对象传入,返回值是某个能够匹配这个Uri对象所对应的自定义代码, 利用这个代码, 我们就可以判断出调用方期望访问的是哪张表中的数据了。

getType()方法:它是所有的内容提供器都必须提供的一个方法, 用于获取Uri对象所对应的MIME类型。 一个内容URI所对应的MIME字符串主要由三部分组分,Android对这三个部分做了如下格式规定。

1.必须以vnd开头。

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

3.最后接上vnd..。

上一篇 下一篇

猜你喜欢

热点阅读