Android - ContentProvider

内容提供器 ContentProvider 是 Android  实现跨程序共享数据的标准方式。

ContentResolver

如果想要访问 ContentProvider 的数据,需要借助 ContentResolve 类。

        我们可以通过 Context 的 getContentResolver() 方法获取到该类的 ContentResolve 实例。

Uri

ContentResolver 中的增删改查方法都接收 Uri 参数,Uri 由两部分组成:权限 ( authority )和路径 ( path ) 。

URI 标准格式:content://com.example.app.provider/table1

得到了 URI  字符串后,我们需要将它解析成Uri 对象才可以作为参数传入,只需调用 Uri.parse() 即可。

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

query()

现在我们就可以使用这个 Uri 对象来查询 table1 表中的数据了:
        Cursor cursor = getContentResolver().query( uri, projection, selection, selectionArgs, sortOrder);

        查询完成后,返回的仍然是一个Cursor 对象,我们只需要把数据从 Cursor 对象中逐个读取出来了。

<span style="font-size:14px;">if (cursor != null) {
    while (cursor.moveToNext()) {
        String column1 = cursor.getString(cursor.getColumnIndex("column1"));
        int column2 = cursor.getInt(cursor.getColumnIndex("column2"));
    }
    cursor.close();
}</span>

insert()

        掌握了最难的查询操作,剩下的增加、修改、删除操作就更不在话下了。

        我们先来看看如何向 table1 表中添加一条数据,代码如下所示:

ContentValues values = new ContentValues();
values.put("column1", "text");
values.put("column2", 1);
getContentResolver().insert(uri, values);
        将待添加的数据组装到 ContentValues 中,然后调用 insert() 方法,将 Uri 和 ContentValues 作为参数传入即可。

update()

        如果我们想更新这条新添加的数据, 把column1 的值清空, 可以借助 update() 方法实现。
ContentValues values = new ContentValues();
values.put("column1", "");
getContentResolver().update(uri, values, "column1 = ? and column2 = ?", new String[] {"text", "1"});
        注意上述代码使用了selection 和 selectionArgs 参数来对想要更新的数据进行约束,以防止所有的行都会受影响。

delete()

        最后,我们可以调用 ContentResolver 的delete() 方法将这条数据删除掉。

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

创建自己的内容提供器

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;
    }
}
ContentPrivider 六方法

1  onCreate()  初始化

public boolean onCreate()

通常完成数据库的创建和升级等操作。

只有 ContentResolver 尝试访问数据时,才会调用onCreate() 

2  query()  查询数据

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

uri 确定查询哪张表

projection 确定查询哪些列

selection 和 selectionArgs 约束查询哪些行

sortOrder 对结果进行排序

查询的结果存放在Cursor 对象中返回

3  insert()  添加数据

public Uri insert(Uri uri, ContentValues values)

uri  确定要添加到哪张表

values  待添加数据参数中

添加完成后,返回一个用于表示这条新记录的 URI 。

4  update()  更新数据

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

uri  确定表

values  新数据

selection 和 selectionArgs  约束更新哪些行

被更新的行的行数会被返回。

5  delete()

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

uri  确定表

selection 和 selectionArgs  约束删除哪些行

被删除的行的行数会被返回。

6  getType()

public String getType(Uri uri)

根据传入的 URI 返回相应的 MIME 类型。







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值