ContentProvider的使用
访问其他应用的ContentProvider
通过Context类获取ContentResolver类才能对对ContentProvider进行数据访问
查询
//在Context下直接getContentResolver()获取
contentResolver = getContentResolver()
val uri = Uri.parse(content://com.example.myapplication.provider/table1)
val cursor = contentResolver.query(
uri,
projection,
selection,
selectionArgs,
sortOrder)
while ( cursor.moveToNext() ){
val column1 = cursor.getString(cursor.getColumnIndex("column1"))
val column2 = cursor.getInt(cursor.getColumnIndex("column2"))
}
cursor.close()
增加数据
val values = contentValuesOf("column1" to "text", "column2" to 1)
contentResolver.insert(uri, values)
更新数据
val values = contentValuesOf("column1" to "")
contentResolver.update(uri, values, "column1 = ? and column2 = ?", arrayOf("text", "1"))
删除数据
contentResolver.delete(uri, "column = ?", arrayOf("1"))
创建自己的ContentProvider
重写这些方法,关键在于将Uri可以转换成相应的表,这里要用到UriMatcher类进行映射
class MyProvider : ContentProvider() {
override fun onCreate() : Boolean {
return false
}
override fun query(uri : Uri, projection: Array<String>?, selection:String?,
selectionArgs:Array<String>?, sortOrder:String?): Cursor? {
return null
}
override fun insert(uri:Uri, values: ContentValues?): Uri?{
return null
}
override fun update(uri:Uri, values:ContentValues?, selection:String?,
selectionArgs: Array<String>?): Int {
return 0
}
override fun dalete(uri:Uri, selection:String?, selevtionArgs:Array<String>?): Int{
return 0
}
override fun getType(uri:Uri):String?{
return null
}
}
例子:
class MyProvider : ContentProvider() {
private val table1Dir = 0
private val table1Item = 1
private val table2Dir = 2
private val table2Item = 3
//包名为com.example.databasetest
private val authority = "com.example.databasetest.provider"
private dbHelper : MyDatabaseHelper? = null
private val uriMatcher by lazy{
val matcher = UriMatcher(UriMatcher.NO_MATCH)
uriMatcher.addURI(authority,"book",bookDir)
uriMatcher.addURI(authority,"book/#",bookItem)
uriMatcher.addURI(authority,"category",categoryDir)
uriMatcher.addURI(authority,"category/#",categoryItem)
matcher
}
override fun onCreate() = context?.let{
dbHelper = MyDatabaseHelper(it, "BookStore.db",2)
true
}?:false
override fun query(uri : Uri, projection: Array<String>?, selection:String?,
selectionArgs:Array<String>?, sortOrder:String?) = deHelper?.let{
val db = it.writableDatabase
val cursor = when(uriMatcher.match(uri)){
bookDir -> db.query("Book", projection, selection, selectionArgs,
null,null, sortOrder)
bookItem -> {
val bookId = uri.pathSegments[1]
db.query("Book", projection, "id = ?", arrayOf(bookId),
null, null, sortOrder)
}
categoryDir -> db.query("Category", projection, selection, selectionArgs,
null, null, sortOrder)
categoryItem -> {
val categoryId = uri.pathSegments[1]
db.query("Category",projection, "id=?", arrayOf(categoryId),
null, null, sortOrder)
}
else -> null
}
cursor //最后返回db查询操作后的cursor
}
override fun insert(uri:Uri, values: ContentValues?) = dbHelper?.let{
val db = it.writableDatabase
val uriReturn = when(uriMatcher.match(uri)){
bookDir,bookItem -> {
val newBookId = db.insert("Book", null, values)
Uri.parse("content://$authority/book/$newBookId")
}
categoryDir,categoryItem -> {
val newCategoryId = db.insert("Category", null, values)
Uri.parse("content://$authority/category/$newCategoryId")
}
else -> null
}
uriReturn //最后返回db查询操作后的cursor
}
}
override fun update(uri:Uri, values: ContentValues?) = dbHelper?.let{
val db = it.writableDatabase
val updatedRows = when(uriMatcher.match(uri)){
bookDir -> db.update("Book", values, selection, selectionArgs)
bookItem -> {
val bookId = uri.pathSegments[1]
db.update("Book", projection, "id = ?", arrayOf(bookId))
}
categoryDir -> db.update("Category", values, selection, selectionArgs)
categoryItem -> {
val categoryId = uri.pathSegments[1]
db.query("Category", values, "id=?", arrayOf(categoryId))
}
else -> 0
}
updatedRows
} ?: 0
override fun delete(uri:Uri, selection:String?, selectionArgs: Array<String>?)
=dbHelper?.let{
val db = it.writableDatabase
val deletedRows = when(uriMatcher.match(uri)){
bookDir -> db.delete("Book", selection, selectionArgs)
bookItem -> {
val bookId = uri.pathSegments[1]
db.update("Book", "id = ?", arrayOf(bookId))
}
categoryDir -> db.delete("Category", selection, selectionArgs)
categoryItem -> {
val categoryId = uri.pathSegments[1]
db.delete("Category", "id=?", arrayOf(categoryId))
}
else -> 0
}
deletedRows
} ?: 0
override fun getType(uri: Uri) = when(uriMatcher.match(uri)) {
bookDir -> "vnd.android.cursor.dir/vnd.com.example.databasetest.provider.book"
bookItem -> "vnd.android.cursor.item/vnd.com.example.databasetest.provider.book"
categoryDir - > "vnd.android.cursor.dir/vnd.com.example.databasetest.provider.category"
categoryItem -> "vnd.android.cursor.item/vnd.com.example.databasetest.provider.category"
else -> null
}