ContentProvider

ContentProvider内容提供者

Android是基于Linux系统,每个用户有独立的进程,这些进程之间是不能互相访问的,如果有需要在各个用户之间共享数据,我们需要使用CotentProivder实现。另外,ContentProvider可以提供一个统一的接口使上层调用者不用关心数据存储的细节问题。

URI
content:// com.anjoyo.myfirstprovider/mitt/12
----A-----|-----------B--------------|--C--|D
A.标准前缀表明这个数据被一个内容提供器所控制。
B.URI的权限部分;它标识这个内容提供器。对于第三方应用程序,这应该是一个全称类名以确保唯一性。权限在<provider>元素的权限属性中进行声明:

<provider android:name=".MyContentProvider"
    android:authorities="com.anjoyo.myfirstprovider"
/>

C.用来判断请求数据类型的路径。这可以是0或多个段长。这个分段可以没有。
D.被请求的特定记录的ID,如果有的话。这是被请求记录的_ID数值。如果这个请求不局限于单个记录, 这个分段和尾部的斜线会被忽略。

-----------
每一个ContentProvider都拥有一个公共的URI,这个URI用于表示这个ContentProvider所提供的数据。
Android所提供的ContentProvider都存放在android.provider包当中。

-----------
ContentProvider的函数
query()  查询
insert()  插入
update() 更新
delete() 删除
getType() 得到数据类型
onCreate() 创建时的回调函数
------------
实现ContentProvider过程
1.定义一个类,继承ContentProvider
2.定义一个CONTENT_URI常量
3.实现query,insert,update,delete,getType和onCreate方法
4.在AndroidManifest.xml中声明

---------------
Uri insertedUri = ContentUris.withAppendedId(uri, rowId);
重新构建一个URI对象,如果uri是content://contacts/people,
rowId是45。重新构建的URI是content://contacts/people/45
getContext().getContentResolver().notifyChange(insertedUri, null);
notifyChange()方法则用来通知注册在此URI上的观察者(observer)数据发生了改变。最后返回删除或修改数据的行数。

ContentUris是Uri的工具类。其主要方法有:
1):把id拼接到Uri上,然后生成新的Uri
Uri insertUri = ContentUris.withAppendedId(uri,id);
2)解析Uri的id部分
long id = ContentUris.parseId(uri);

另外:uri有个方法是getPathSegments()是获取uri的每一部分,返回值是List<String>

List<String> list = uri.getPathSegments();
System.out.println(list);
String idstr = list.get(list.size()-1);
long id = Long.parseLong(idstr);
//等价于下边代码
long id = ContentUris.parseId(uri);

-------------------------

如何访问ContentProvider?
step1.获取ContentResolver对象
ContentResolver cr = mContent.getContentResolver();
Cursor c = cr.query(Uri,...);
Uri insertedUri = cr.insert(Uri,...);
...

SqliteQueryBuilder使用。它是在查询时候,可以灵活添加查询条件。不能执行添加更新等操作。

@Override
public Cursor query(Uri uri, String[] projection, String selection,
        String[] selectionArgs, String sortOrder) {
    SQLiteQueryBuilder builder = new SQLiteQueryBuilder();
    switch (uriMatcher.match(uri)) {
    case PERSONS:
        builder.setTables("mitt_tb");
        break;
    case PERSON:
        builder.setTables("mitt_tb");
        long id = ContentUris.parseId(uri);
        //添加查询条件
        builder.appendWhere("id="+id);
        break;
    }
    SQLiteDatabase db = helper.getReadableDatabase();
    Cursor c = builder.query(db, projection, selection, selectionArgs, null, null, sortOrder);
    return c;
}
posted on 2013-01-07 14:42  @与非  阅读(550)  评论(0编辑  收藏  举报