美文网首页
Android ContentProvider 跨程序共享数据

Android ContentProvider 跨程序共享数据

作者: bigshizi | 来源:发表于2020-07-26 16:19 被阅读0次

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
    }
}

相关文章

网友评论

      本文标题:Android ContentProvider 跨程序共享数据

      本文链接:https://www.haomeiwen.com/subject/qutwlktx.html