自定义内容提供者

  • 资料来源 《第一行代码》

1、内容URI的格式分两种:

  • content://com.wj.meme.provider/table1
    查询com.wj.meme这个应用下的table1表所有数据。

  • content://com.wj.meme.provider/table1/1
    查询table1表里id=1的数据。

2、 使用通配符表示:

“*” 表示匹配任意长度的任意字符
“#” 表示匹配任意长度的数字

  • 一个能够匹配任意表的内容URI格式就可以写成:
    content://com.wj.meme.provider/*
  • 一个能够匹配table1表中任意一行数据的内容URI格式就可以写成:
    content://com.wj.meme.provider/table1/#

3、MIME类型

一个内容URI所对应的MIME字符串主要由3部分组成,Android对这3个部分做了如下规定:
必须以vnd开头。
如果内容URI以路径结尾,则后接android.cursor.dir/,如果内容URI以id结尾,则后接android.cursor.item/。
最后,接上“vnd..”。
比如:
TABLE1_DIR:
return “vnd.android.cursor.dir/vnd.com.wj.meme.provider.table1”;
TABLE1_ITEM:
return “vnd.android.cursor.item/vnd.com.wj.meme.provider.table1”;
TABLE2_DIR:
return “vnd.android.cursor.dir/vnd.com.wj.meme.provider.table2”;
TABLE2_ITEM:
return “vnd.android.cursor.item/vnd.com.wj.meme.provider.table2”;

4.数据库结合内容提供者,为外界提供接口

**
 * 自定义内容提供者
 */
public class DatabaseProvider extends ContentProvider {
    public DatabaseProvider() {
    }

    public static final int MEME_DIR = 0;
    public static final int MEME_ITEM = 1;
    public static final int PAO_DIR = 2;
    public static final int PAO_ITEM = 3;
    public static final String AUTHORITY = "com.wj.meme.provider";
    private static UriMatcher uriMatcher;
    private MyDatabaseHelper dbHelper;

    static {
        uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
        uriMatcher.addURI(AUTHORITY, "meme", MEME_DIR);
        uriMatcher.addURI(AUTHORITY, "meme/#", MEME_ITEM);
        uriMatcher.addURI(AUTHORITY, "paopao", PAO_DIR);
        uriMatcher.addURI(AUTHORITY, "paopao/#", PAO_ITEM);


    }

    /**
     * 创建数据库
     *
     * @return true 表示创建数据库成功
     */
    @Override
    public boolean onCreate() {
        dbHelper = new MyDatabaseHelper(getContext());
        return true;
    }

    @Override
    public Cursor query(Uri uri, String[] projection, String selection,
                        String[] selectionArgs, String sortOrder) {
        SQLiteDatabase db = dbHelper.getReadableDatabase();
        Cursor cursor = null;
        switch (uriMatcher.match(uri)) {
            case MEME_DIR:
                cursor = db.query("meme", projection, selection, selectionArgs, null, null, sortOrder);
                break;
            case MEME_ITEM:
                String memeId = uri.getPathSegments().get(1);
                cursor = db.query("meme", projection, "id=?", new String[]{memeId}, null, null, sortOrder);
                break;
            case PAO_DIR:
                cursor = db.query("paopao", projection, selection, selectionArgs, null, null, sortOrder);
                break;
            case PAO_ITEM:
                String paopaoId = uri.getPathSegments().get(1);
                cursor = db.query("paopao", projection, "id=?", new String[]{paopaoId}, null, null, sortOrder);
                break;
        }
        return cursor;

    }

    @Override
    public Uri insert(Uri uri, ContentValues values) {
        SQLiteDatabase db = dbHelper.getReadableDatabase();
        Uri uriReturn = null;
        switch (uriMatcher.match(uri)) {
            case MEME_DIR:
            case MEME_ITEM:
                long newMemeId = db.insert("meme", null, values);
                uriReturn = Uri.parse("content://" + AUTHORITY + "/meme/" + newMemeId);
                break;
            case PAO_DIR:
            case PAO_ITEM:
                long newPaopaoId = db.insert("meme", null, values);
                uriReturn = Uri.parse("content://" + AUTHORITY + "/paopao/" + newPaopaoId);
                break;

        }


        return uriReturn;
    }


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

        SQLiteDatabase db = dbHelper.getReadableDatabase();
        int updateRows = 0;
        switch (uriMatcher.match(uri)) {
            case MEME_DIR:
                updateRows = db.update("meme", values, selection, selectionArgs);
                break;
            case MEME_ITEM:
                String memeId = uri.getPathSegments().get(1);
                updateRows = db.update("meme", values, "id=?", new String[]{memeId});
                break;
            case PAO_DIR:
                updateRows = db.update("paopao", values, selection, selectionArgs);
                break;
            case PAO_ITEM:
                String paopaoId = uri.getPathSegments().get(1);
                updateRows = db.update("paopao", values, "id=?", new String[]{paopaoId});
                break;


        }


        return updateRows;

    }


    @Override
    public int delete(Uri uri, String selection, String[] selectionArgs) {
        SQLiteDatabase db = dbHelper.getReadableDatabase();
        int deleteRows = 0;

        switch (uriMatcher.match(uri)) {
            case MEME_DIR:
                deleteRows = db.delete("meme",selection,selectionArgs);
                break;
            case MEME_ITEM:
                String memeId = uri.getPathSegments().get(1);
                deleteRows = db.delete("meme","i=?",new String[]{memeId});
                break;
            case PAO_DIR:
                deleteRows = db.delete("paopao",selection,selectionArgs);
                break;
            case PAO_ITEM:
                String paopaoId = uri.getPathSegments().get(1);
                deleteRows = db.delete("meme","i=?",new String[]{paopaoId});
                break;


        }

        return deleteRows;

    }

    @Override
    public String getType(Uri uri) {
        switch (uriMatcher.match(uri)){
            case MEME_DIR:
                return "vnd.android.cursor.dir/vnd."+AUTHORITY+"meme";
            case MEME_ITEM:
                return "vnd.android.cursor.item/vnd."+AUTHORITY+"meme";
            case PAO_DIR:
                return "vnd.android.cursor.dir/vnd."+AUTHORITY+"paopao";
            case PAO_ITEM:
                return "vnd.android.cursor.item/vnd."+AUTHORITY+"paopao";

        }

        return null;
    }


}

5.外界调用自定义的内容提供者

public class SecondActivity extends AppCompatActivity {

    private String newId;
    public static final String URI = "content://com.wj.meme.provider/meme";
    @Override
    public void onCreate(Bundle savedInstanceState, PersistableBundle persistentState) {
        super.onCreate(savedInstanceState, persistentState);
    }


    public void insert(){
        Uri uri = Uri.parse(URI);
        ContentValues values = new ContentValues();
        values.put("name","aaaa");
        Uri newUri = getContentResolver().insert(uri, values);
        newId = newUri.getPathSegments().get(1);
    }

    public void query() {
        Uri uri = Uri.parse(URI);
        Cursor cursor = getContentResolver().query(uri, null, null, null, null);
        if (cursor != null) {
            while (cursor.moveToNext()) {
                //
            }
            cursor.close();
        }
    }

    public void update(){
        Uri uri = Uri.parse(URI+"/"+newId);
        ContentValues values = new ContentValues();
        values.put("name","bbbbb");
        getContentResolver().update(uri,values,null,null);
    }

    public void delete(){
        Uri uri = Uri.parse(URI+"/"+newId);
        getContentResolver().delete(uri,null,null);
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值