右击com.example.myapplication包->New->Other->Content Provider。会弹出窗口
点击finish,完成创建ContentProvider类,这时你可以在注册代码中看到
注册ContentProvider时通常指定属性
属性 | 描述 |
name | 指定该ContentProvider的实现类的类名 |
authorities | 指定该ContentProvider对应的URI |
enabled | 指定该ContentProvider是否可用 |
exported | 指定该ContentProvider是否允许其他应用调用 |
ContentResolver中的增删改查方法都不接收表名参数,而是使用一个Uri参数代替,这个参数被称为内容URI。
content://
(1)以路径结尾:表示期望访问该表地所有数据
(2)以id结尾:表示期望访问该表拥有相应id的数据
*表示匹配任意长度的任意字符
#表示匹配任意长度的数字
一个能够匹配任意表的内容URI格式
content://com.example.myapplication.provider/*
一个能够匹配table表中任意一行数据的内容URI格式
content://com.example.myapplication.provider/table1/#
val uri=Uri.parse("content://com.example.myapplication.provider/table1")
getType方法中,一个内容URI所对应的MIME字符串主要由3部分组成,Android对这3部分做了如下格式规定
- 必须以vnd开头
- 如果内容URI以路径结尾,则后接android.cursor.dir/。
- 如果内容URI以id结尾,则后接android.cursor.item/。
- 最后接上vnd.
. 。 例子:content://com.example.myapplication.provider/table1
MIME类型:vnd.android.cursor.dir/vnd.com.example.myapplication.provider.table1
override fun delete(uri: Uri, selection: String?, selectionArgs: Array?): Int {
}
override fun getType(uri: Uri): String? {
}
override fun insert(uri: Uri, values: ContentValues?): Uri? {
}
override fun onCreate(): Boolean {
}
override fun query(uri: Uri, projection: Array?, selection: String?,
selectionArgs: Array?, sortOrder: String?): Cursor? {
}
override fun update(uri: Uri, values: ContentValues?, selection: String?,
selectionArgs: Array?): Int {
}
UriMatcher的addURI()方法,接收三个参数,可以分别把authority、path和一个自定义代码传进去。这样,当调用UriMatcher的match()方法时,把一个Uri对象传入,就会返回一个与这个Uri对象匹配的一个自定义代码。
class MyContentProvider : ContentProvider() {
private val table1Dir=0
private val table1Item=1
private val table2Dir=2
private val table2Item=3
private val uriMatcher=UriMatcher(UriMatcher.NO_MATCH)
init {
uriMatcher.addURI("com.example.app.provider","table1",table1Dir)
uriMatcher.addURI("com.example.app.provider","table1/#",table1Item)
uriMatcher.addURI("com.example.app.provider","table2",table2Dir)
uriMatcher.addURI("com.example.app.provider","table2Item",table2Item)
}
...
override fun query(uri: Uri, projection: Array?, selection: String?,
selectionArgs: Array?, sortOrder: String?): Cursor?
{
when(uriMatcher.match(uri)){
table1Item->{
//查询table1表中的所有数据
}
table1Item->{
//查询table1表中的单条数据
}
table2Dir->{
//查询table2表中的所有数据
}
table2Item->{
//查询table2表中的单条数据
}
}
}
...
}
要访问ContentProvider中共享的数据,就要调用Context的getContentResolver()方法获取ContentResolver的实例,然后对数据进行增减改查的操作。
(1)查询
val cursor=contentResolver.query(uri,projection,selection,selectionArgs,sortOrder)
if (cursor != null) {
while (cursor.moveToNext()){
val column1=cursor.getString(cursor.getColumnIndex("column1"))
val column2=cursor.getString(cursor.getColumnIndex("colum2"))
}
cursor.close()
}
(2)增加
val values= contentValuesOf("column1" to "text","column2" to 1)
contentResolver.insert(uri,values)
(3)修改
val values= contentValuesOf("column1" to "")
contentResolver.update(uri, values,"column1 = ? and column2 = ?", arrayOf("text","1"))
(4)删除
contentResolver.delete(uri,"column2 = ?", arrayOf("1"))