1. 使用ContentProvider访问其他程序中的数据
想要访问其他程序的数据需要通过ContentResolver来实现,所以首先需要通过Context中的getContentResolver方法获取到ContentResolver实例,然后通过query方法查询数据,insert添加数据,update更新数据,delete删除数据。
这些方法基本和SQLite中的方法一样,不过这里不需要那么多的参数,也不需要传入表名参数。作为代替,我们需要传入一个Uri参数用来寻找数据库,这个参数被称为内容URI,它给内容提供器中的数据建立了唯一标识符。
特殊的,有些系统自带应用比如通讯录的Uri参数是已经被封装好的,可以直接调用不需要解析。
内容URI由两部分组成:authority和path。authority用于区分不同的应用程序,一般使用应用程序的包名,path则是对同一应用程序中不同的表做区分的。最后一个标准的内容URI还需要在前面加上协议声明,比如这样:content://com.example.test/table1
- 查询数据
//和SQLite一样使用Cursor对象存储调用getContentResolver().query方法查询的数据,这里的query方法只有五个参数:
/**
* 1. Uri对象,一般是内容URI字符串通过Uri.parse方法转换为Uri对象,格式:
* 2. 要查询的列名
* 3. 查询约束条件
* 4. 为约束条件的占位符提供那个具体的值
* 5. 指定查询结果的排序方式
*/
Uri uri = Uri.parse("content://com.example.test/table1");
Cursor cursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, null);
//取出查询返回的数据
if (cursor != null) {
while (cursor.moveToNext()) {
//使用列名获取想要查询的数据
String column1 = cursor.getString(cursor.getColumnIndex("column1"));
}
cursor.close();
}
- 添加数据