内容提供器提供了两种方法,一种是使用现有的内容提供器来读取和操作相应的程序中的数据,另一种是创建自己的内容提供器给我们的程序数据提供外部访问接口。接下来就从使用现有的内容提供器开始。
什么是现有的内容提供器呢?其实就是我们手机上使用系统自带的电话薄,短信,媒体库等程序。它们提供了类似的访问接口,这就使得第三方应用程序可以充分的使用这部分数据来实现更好的功能。下面就来实践一下,内容提供器是如何使用的!
2.1)ContentResolver的基本用法
如果要使用内容提供器中共享数据,就要使用ContentResolve类,可以通过Context中的getContentResolve()方法获取到该类的实例。跟SQLite有点类似,ContentResolve中提供了一系列的方法用于对数据的CURD操作,其中insert()方法用于添加数据,update()用于更新数据,delete()方法用于删除数据,query()方法用于查询数据。但是在方法上稍微有点区别。
首先是ContentResolve中增删改查方法都是不接受表明参数的,而是使用一个Uri参数代替,这个参数被称为URI。内容URI给内容提供器中的数据建立了唯一的标识符,主要由authority和path.authority是用于对不同的应用程序做区分的,为了避免冲突都会采用程序包名的方式来命名,例如:content://com.example.app.provider。Path则是对不同的表进行区分的,通常添加到authority的后面。例如数据库里存在两张表:table1和table2这时候就可以将path分别命名为 /table1和/table2,然后将authority和path进行组合,内容URL就变成了 content://com.example.app.provider/table1和content://com.example.app.provider/table2。不过目前目前还很难辩认出这两个字符就是两个内容的URL,我们还需要在字符串的头部加上协议声明,因此,内容URI最标准的格式写法。因此标准写法为:content://content://com.example.app.provider/table1
Content://content://com.example.app.provider/table2
在得到了内容URL字符之后,我们还需要将它解析成Uri对象才可以作为参数传入。解析的方法如下:
Uri uri = Uri.parse(“content://content://com.example.app.provider/table1”);
然后再调用Uri.parse()方法,就可以将内容URI字符串解析成Uri对象。现在我们就可以使用这个对象来查询table1表中的数据了,代码如下所示:
Cursor cursor = getContentResolver().query(
uri,
projection,
selection,
selectionArgs,
sortOrder);
总体程序跟SQLiteDatabase中的·query()方法里的参数很像,但总体来说比较简单一些,毕竟是在访问其他程序,没必要过于复杂的查询语句。下表就是对着使用的参数进行了详细的解释。
查询完之后返回的仍然是一个Cursor对象,这个时候我们就可以将数据从Cursor对象中逐个取出来。读取的方法就是通过移动游标的位置来遍历Cursor所有行,然后再取出每一行中相应的数据代码如下所示:
if( cursor != null){
while(cursor.moveToNext()){
String column1 = cursor.getString(cursor.getColumnIndex("column1"));
int column2 = cursor.getInt(cursor.getcolumnIndex("column1"));
}
cursor.close();
}
掌握了最难的查询操作,剩下的增加、修改、删除操作就更不在话下了。 例如向table1表中添加一条数据:
ContentValues values = new ContentValues();
values.put("column1","text");
values.put("column2",1);
getContentResolver().insert(uri,values);
代码分析:首先是将待添加的数据组装到ContentValues中,然后调用ContentResolver的insert()方法,将Uri和ContentValues作为参数传入即可。
接着我们来更新这条新添加数据,把column1的值清空,可以借助ContentResolver的update()方法实现。代码如下所示:
ContentValues values = new ContentValues();
values.put("column1","");
getContentResolver().update(uri,values,"column1 = ? and column2 = ?",new String[]{"text",1});
代码分析:跟添加数据一样的操作,不过上述代码使用了selection和selectionArg参数来对想要更新的数据进行约束,以防止所有的行为都会受影响。
最后调用ContentResolver()的delete()方法方法将这个数据删除掉,代码如下所示
getContentResolver().delete(uri,"column2 = ?",new String[]{“1”});