ContentProvider的使用

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
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值