定义

ContentProvider顾名思义就是内容提供者,通过屏蔽底层过程间通信的具体实现,为不同利用之间的数据共享提供对立的接口。用户能够灵便的实现ContentProvider封装的数据存储和增删改查接口。

  • ContentProvider中应用URI拜访数据,URI格局如下:

    [scheme://][host:port][path][?query]

    content://com.example.provider/person

应用

1.在AndroidManifest.xml注册

<provider    android:authorities="com.example.provider"    android:name=".ExampleContentProvider"    android:exported="true"/>
  • 其中authorities字段即为以后ContentProvider的惟一标识,拜访URI为content://com.example.provider

2.代码实现

(1)定义数据库操作类

public class DbHelper extends SQLiteOpenHelper {    private static final String DB_NAME = "person.db";    private static final int DB_VERSION = 1;    private static final String TABLE_NAME = "person";    private static final String ID = "_id";        private static final String NAME = "name";    public DbHelper(Context context) {        super(context, DB_NAME, null, DB_VERSION);    }    @Override    public void onCreate(SQLiteDatabase db) {        String sql = "CREATE TABLE " + TABLE_NAME + "(" + ID                + " INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL" + "," + NAME                + " CHAR(10) )";        db.execSQL(sql);    }    @Override    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {    }}

(2)实现ContentProvider

public class ExampleContentProvider extends ContentProvider {    private SQLiteDatabase db;    private static final String MAUTHORITIESNAME = "com.example.provider";    private static UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH);    private static final int PERSON = 1;    private static final int PERSON_NUMBER = 2;    private static final int PERSON_TEXT = 3;    private static final String TABLE_NAME = "person";    // 构建URI    static {        // content://com.example.provider/person        matcher.addURI(MAUTHORITIESNAME, "person", PERSON);        // # 代表任意数字content://com.example.provider/person/1        matcher.addURI(MAUTHORITIESNAME, "person/#", PERSON_NUMBER);        // * 代表任意文本 content://com.example.provider/person/filter/personXxx        matcher.addURI(MAUTHORITIESNAME, "person/filter/*", PERSON_TEXT);    }    @Override    public int delete(Uri uri, String selection, String[] selectionArgs) {        // Implement this to handle requests to delete one or more rows.        return 0;    }    @Override    public String getType(Uri uri) {        // Implement this to handle requests for the MIME type of the data        // at the given URI.        return null;    }    @Override    public Uri insert(Uri uri, ContentValues values) {        // Implement this to handle requests to insert a new row.        int match = matcher.match(uri);        switch (match) {            case PERSON:                long id = db.insert(TABLE_NAME, null, values);                return ContentUris.withAppendedId(uri, id);            case PERSON_NUMBER:            case PERSON_TEXT:            default:                break;        }        return null;    }    @Override    public boolean onCreate() {        // Implement this to initialize your content provider on startup.        DbHelper dbHelper = new DbHelper(getContext());        db = dbHelper.getWritableDatabase();        return true;    }    @Override    public Cursor query(Uri uri, String[] projection, String selection,                        String[] selectionArgs, String sortOrder) {        // Implement this to handle query requests from clients.        int match = matcher.match(uri);        switch (match) {            case PERSON:                db.query(TABLE_NAME, projection, selection, selectionArgs, null ,null, sortOrder);            case PERSON_NUMBER:            case PERSON_TEXT:            default:                break;        }        return null;    }    @Override    public int update(Uri uri, ContentValues values, String selection,                      String[] selectionArgs) {        // Implement this to handle requests to update one or more rows.       return 0;    }}

(3)通过ContentResolver调用ContentProvider拜访数据库

private String uri = "content://com.example.provider/person";public String queryPersonName() {    String name = null;    Cursor cursor = getContentResolver().query(Uri.parse(uri), null, null, null, null);    while (cursor.moveToNext()) {        name = cursor.getString(cursor.getColumnIndex("name"));    }    return name;}public void insertPerson(String name) {    ContentValues values = new ContentValues();    values.put("name", name);    Uri result = getContentResolver().insert(Uri.parse(uri), values);    long parseid = ContentUris.parseId(result);    if (parseid > 0) {        // insert success    }}

内容解决者ContentResolver

ContentResolver通过URI调用getContentResolver()获取ContentProvider 提供的数据接口,进而进行增删改查等操作。

getContentResolver().query(Uri.parse(uri), null, null, null, null);

内容观察者ContentObserver

ContentObserver 内容观察者通过指定URI 监听ContentProvider数据是否扭转。

1.注册ContentObserver

private void registerContentObserver() {    Uri uri = Uri.parse("content://com.example.provider/person");    getContentResolver().registerContentObserver(uri, true,            new ExampleContentObserver(new Handler()));}

2.监听内容变动

public class ExampleContentObserver extends ContentObserver {    private static final String TAG = ExampleContentObserver.class.getSimpleName();        public ExampleContentObserver(Handler handler) {        super(handler);    }    @Override    public void onChange(boolean selfChange) {        super.onChange(selfChange);        Log.i(TAG, "content has been changed");    }}