Android ContentProvide 内容提供器学习笔记

阅读《第一行代码》笔记

 

ContentResolver的基本用法:

使用uri来表示要访问的数据来源

Uri uri = Uri.parse("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" }); 

记得在结束的时候关掉cursor

if (cursor != null) { cursor.close(); }

 

创建自己的内容提供器:

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; 
    }
} 

 

1. onCreate() 初始化内容提供器的时候调用。通常会在这里完成对数据库的创建和升级等操作, 返回 true 表示内容提供器初始化成功,返回 false 则表示失败。注意,只有当存在 ContentResolver尝试访问我们程序中的数据时,内容提供器才会被初始化。

2. query() 从内容提供器中查询数据。使用 uri参数来确定查询哪张表,projection参数用于确 定查询哪些列,selection和 selectionArgs参数用于约束查询哪些行,sortOrder参数用于 对结果进行排序,查询的结果存放在 Cursor对象中返回。

3. insert() 向内容提供器中添加一条数据。使用 uri参数来确定要添加到的表,待添加的数据 保存在 values参数中。添加完成后,返回一个用于表示这条新记录的 URI。

4. update() 更新内容提供器中已有的数据。使用 uri参数来确定更新哪一张表中的数据,新数 据保存在 values参数中,selection和 selectionArgs参数用于约束更新哪些行,受影响的 行数将作为返回值返回。

5. delete() 从内容提供器中删除数据。使用 uri参数来确定删除哪一张表中的数据,selection 和 selectionArgs参数用于约束删除哪些行,被删除的行数将作为返回值返回。

6. getType() 根据传入的内容 URI来返回相应的 MIME类型。 

 

内容 URI的格式主要就只有以上两种,以路径结尾就表示期望访问该表中所有的数据, 以 id结尾就表示期望访问该表中拥有相应 id的数据。

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

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

所以,一个能够匹配任意表的内容 URI格式就可以写成: content://com.example.app.provider/*

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

TABLE1_DIR = 0,  表示请求的uri为“com.example.app.provider/table1"

TABLE1_ITEM = 1,表示请求的uri为"com.example.app.provider/table1/#"

TABLE2_DIR  = 2,    表示请求的uri为“com.example.app.provider/table2”

TABLE2_ITEM = 3,表示请求的uri为“com.example.app.provider/table2/#”

uriMatcher.match(uri) 返回的就是0, 1,2,3 。通过此值能够获取uri要访问的路径,并响应的做出响应。

public static final int TABLE1_DIR = 0; 
public static final int TABLE1_ITEM = 1; 
public static final int TABLE2_DIR = 2; 
public static final int TABLE2_ITEM = 3; 
private static UriMatcher uriMatcher; 
static { 
    uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);             
    uriMatcher.addURI("com.example.app.provider", "table1", TABLE1_DIR); 
    uriMatcher.addURI("com.example.app.provider ", "table1/#", TABLE1_ITEM); 
    uriMatcher.addURI("com.example.app.provider ", "table2", TABLE2_ITEM); 
    uriMatcher.addURI("com.example.app.provider ", "table2/#", TABLE2_ITEM); 
}

public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { 
    switch (uriMatcher.match(uri)) { 
        case TABLE1_DIR: 
            // 查询table1表中的所有数据   
            //SQLiteDatabase db = SQLiteOpenHelper.getWritableDatabase();
            //db.query(...);
            break; 
        case TABLE1_ITEM: 
            // 查询table1表中的单条数据 
            break; 
        case TABLE2_DIR: 
            // 查询table2表中的所有数据 
            break; 
        case TABLE2_ITEM: 
            // 查询table2表中的单条数据 
            break; 
        default: 
            break; 
   } 
} 

需要在AndroidManifest.xml中为内容提供器注册

<provider android:name="com.example.databasetest.DatabaseProvider"
          android:authorities="com.example.databasetest.provider" >
 </provider> 

//android:name="com.example.databasetest.DatabaseProvider"  对应的类
//android:authorities="com.example.databasetest.provider"   对应的权限,uri

ContentProvider 内容提供器,实质还是通过SQLite去存储和获取数据,只是增加了一层uri的概念。uriMatcher.match(uri)解析uri 来定位去获取哪个应用的哪个表的哪个数据,对响应的请求做出响应的回答。

系统提供了很多内容提供器,如系统多媒体数据库的视频,图片,音频等都可以使用ContentResolver获取,电话名单等也可以获取到。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值