ContentProvider主要用于跨程序共享数据
用法:
1、使用现有的ContentProvider读取和操作相应程序
2、创建自己的ContentProvider
1.1 想要访问ContenProvider中的共享数据 需要借助 ContentResolver类 通过getContentResolver()来获取示例
ContentResolver 接受一个URI来定位要查询的表
val uri =Uri.parse( 'content://要查询程序的包名.provider/表名')
查询语句
val uri = val uri =Uri.parse( 'content://要查询程序的包名.provider/表名')
val cursor = getContentResolver.query(
uri,//from
projection,//select
selecttion,//where
selectionArgs,
sortOrder//order
)
//通过返回的游标取值
while(cursor.moveToNext){
val column1 = cursor.getString(cursor.getColumnIndex("column1"))
}
增
val values = contentValueof("column1" to "text")
getContentResolver.insert(uri,values)
改
val values = contentValueof("column" to "")
getContentResolver.update(uri,values,"column = ? and column =?",arrayof("text","1"))
删
getContenResolver.delete(uri,"column = ?",arraryof("1"))
2.1创建自己的ContetProvider
可通过继承ContentProvider来实现自己的数据分享接口
先了解一下Uri 的两种写法
1、匹配任何表
'content://要查询程序的包名.provider/表名'
2、匹配表中任意一行数据的格式
'content://要查询程序的包名.provider/表名/#'
通过UriMatcher类可实现区分传入的uri是哪种类型
先定义好几个常量 代表我们允许访问哪些表
然后将其传入UriMather中
这样就可以在增删改查中通过 .match(uri)来知道调用接口的程序想要对那张表做操作了
创建一个类 继承ContentProvider
class MyContentProvider : ContentProvider() {
private val tableDir = 1
private val tableDirItem = 2
private val tableDir2 = 3
private val tableDirItem2 = 4
private val authority = "com.centling.provider"
private val uriMatcher = UriMatcher(UriMatcher.NO_MATCH)
private var myDataBaseHelper : MyDataBaseHelper? = null
init {
uriMatcher.addURI(authority,"Book",1)
uriMatcher.addURI(authority,"Book/#",2)
uriMatcher.addURI(authority,"Book2",3)
uriMatcher.addURI(authority,"Book2/#",4)
}
override fun delete(uri: Uri, selection: String?, selectionArgs: Array<String>?): Int {
return myDataBaseHelper?.let {
val db = it.writableDatabase
val delrows = when (uriMatcher.match(uri)){
tableDir ->{
db.delete("Book",selection,selectionArgs)
}
tableDirItem ->{
val bookid= uri.pathSegments[1]
db.delete("Book","id = ?", arrayOf(bookid))
}
tableDir2 ->{
db.delete("Book2",selection,selectionArgs)
}
tableDirItem2 ->{
val bookid= uri.pathSegments[1]
db.delete("Book2","id = ?", arrayOf(bookid))
}
else -> 0
}
delrows
}?:0
}
override fun getType(uri: Uri): String? {
return when(uriMatcher.match(uri)){
tableDir ->{
"vnd.android.cursor.dir/vnd.com.centling.databasetese.Book"
}
tableDirItem ->{
"vnd.android.cursor.item/vnd.com.centling.databasetese.Book"
}
tableDir2 ->{
"vnd.android.cursor.dir/vnd.com.centling.databasetese.Book2"
}
tableDirItem2 ->{
"vnd.android.cursor.item/vnd.com.centling.databasetese.Book2"
}
else->null
}
}
override fun insert(uri: Uri, values: ContentValues?): Uri? {
return myDataBaseHelper?.let {
val db = it.writableDatabase
val urireturn = when (uriMatcher.match(uri)){
tableDir ,tableDirItem->{
val bookid = db.insert("Book",null,values)
Uri.parse("content://$authority/Book/$bookid")
}
tableDir2,tableDirItem2 ->{
val bookid =db.insert("Book2",null,values)
Uri.parse("content://$authority/Book2/$bookid")
}
else->null
}
urireturn
}
}
override fun onCreate(): Boolean {
return context?.let {
myDataBaseHelper = MyDataBaseHelper(context,"Book_Store.db",2)
true
}?:false
}
override fun query(
uri: Uri, projection: Array<String>?, selection: String?,
selectionArgs: Array<String>?, sortOrder: String?
): Cursor? {
return myDataBaseHelper?.let {
val db = it.readableDatabase
val cursor = when (uriMatcher.match(uri)){
tableDir ->{
db.query("Book",projection,selection,selectionArgs,null,null,sortOrder)
}
tableDirItem ->{
val bookid = uri.pathSegments[1]
db.query("Book",projection,"id = ?", arrayOf(bookid),null,null,sortOrder)
}
tableDir2 ->{
db.query("BOOk2",projection,selection,selectionArgs,null,null,sortOrder)
}
tableDirItem2 ->{
val bookid = uri.pathSegments[1]
db.query("Book2",projection,"id=?", arrayOf(bookid),null,null,sortOrder)
}
else->null
}
cursor
}
}
override fun update(
uri: Uri, values: ContentValues?, selection: String?,
selectionArgs: Array<String>?
): Int {
return myDataBaseHelper?.let {
val db = it.writableDatabase
val updaterows = when (uriMatcher.match(uri)){
tableDir ->{
db.update("Book",values,selection,selectionArgs)
}
tableDirItem ->{
val bookid = uri.pathSegments[1]
db.update("Book",values,"id = ?", arrayOf(bookid))
}
tableDir2 ->{
db.update("Book2",values,selection,selectionArgs)
}
tableDirItem2 ->{
val bookid = uri.pathSegments[1]
db.update("Book2",values,"id = ?", arrayOf(bookid))
}
else->0
}
updaterows
}?:0
}
}
网友评论