Kotlin ContentProvider使用方法介绍

目录
  • 1、注册ContentProvider
  • 2、内容URI
    • 内容URI的标准格式
    • 通配符
  • 3、创建自己的ContentProvider
  • 4、访问其他程序中的数据

1、注册ContentProvider

右击com.example.myapplication包->New->Other->Content Provider。会弹出窗口

点击finish,完成创建ContentProvider类,这时你可以在注册代码中看到

<provider
            android:name=".MyContentProvider"
            android:authorities="com.example.myapplication.provider"
            android:enabled="true"
            android:exported="true"></provider>

注册ContentProvider时通常指定属性

属性 描述
name 指定该ContentProvider的实现类的类名
authorities 指定该ContentProvider对应的URI
enabled 指定该ContentProvider是否可用
exported 指定该ContentProvider是否允许其他应用调用

2、内容URI

ContentResolver中的增删改查方法都不接收表名参数,而是使用一个Uri参数代替,这个参数被称为内容URI。

内容URI的标准格式

content://<authorities>/<path>

(1)以路径结尾:表示期望访问该表地所有数据

(2)以id结尾:表示期望访问该表拥有相应id的数据

<authorities>:authorities是用于对不同的应用程序做区分的,一般会采用包名的方式命名,比如包名为com.example.myapplication,那么<authorities>为com.example.myapplication.provider。

<path>:path是用于对同一应用程序的不同表做区分的,比如com.example.myapplication.provider/table1。

通配符

*表示匹配任意长度的任意字符

#表示匹配任意长度的数字

一个能够匹配任意表的内容URI格式

content://com.example.myapplication.provider/*

一个能够匹配table表中任意一行数据的内容URI格式

content://com.example.myapplication.provider/table1/#

把内容URI字符串解析成Uri对象

val uri=Uri.parse("content://com.example.myapplication.provider/table1")

3、创建自己的ContentProvider

重写ContentProvider类的6个抽象方法

  • onCreate()。初始化ContentProvider的时候调用。通常会在这里完成对数据库的创建和升级等操作,返回true表示ContentProvider初始化成功,返回false则表示失败。
  • query()。从ContentProvider中查询数据。uri参数用于确认查询哪张表,projection参数用于确定查询哪些列,selection和selectionArgs参数用于约束查询哪些行,sortOrder参数用于对结果进行排序,查询的结果存放在Cursor对象中返回。
  • insert()。向ContentProvider中添加一条数据,uri参数用于确定要添加的表,待添加的数据保存在values参数中。添加完成后,返回一个用于表示这条新纪录的URI。
  • updata()。更新ContentProvider中已有的数据,uri参数用于确定更新哪一张表中的数据,新数据保存在values参数中,selection和selectionArgs参数用于约束更新哪些行,受影响的行数将作为返回值返回。
  • delete()。从ContentProvider中删除数据。uri参数用于确定删除哪一张表中的数据,selection和selectionArgs参数用于约束删除哪些行,被删除的行数将作为返回值返回。
  • getType()。根据传入的内容URI返回相应的MIME类型。

getType方法中,一个内容URI所对应的MIME字符串主要由3部分组成,Android对这3部分做了如下格式规定

  • 必须以vnd开头
  • 如果内容URI以路径结尾,则后接android.cursor.dir/。
  • 如果内容URI以id结尾,则后接android.cursor.item/。
  • 最后接上vnd.<acthority>.<path>。

例子: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<String>?): 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<String>?, selection: String?,
                              selectionArgs: Array<String>?, sortOrder: String?): Cursor? {
    }
    override fun update(uri: Uri, values: ContentValues?, selection: String?,
                               selectionArgs: Array<String>?): Int {
    }

(2)利用UriMatcher这个类实现匹配内容URI的功能,来判断出调用方期望访问的时哪张表中的数据。

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<String>?, selection: String?,
                              selectionArgs: Array<String>?, sortOrder: String?): Cursor?
  {
        when(uriMatcher.match(uri)){
            table1Item->{
                //查询table1表中的所有数据
            }
            table1Item->{
                //查询table1表中的单条数据
            }
            table2Dir->{
                //查询table2表中的所有数据
            }
            table2Item->{
                //查询table2表中的单条数据
            }
        }
    }
...
}

4、访问其他程序中的数据

1、ContentResolver的基本用法

要访问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"))

到此这篇关于kotlin ContentProvider使用方法介绍的文章就介绍到这了,更多相关kotlin ContentProvider内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Kotlin ContentProvider使用方法详解

    目录 ContentProvider提供者 contentResolver获取短信数据 ContentObserver监控短信的到来 小结 android的四大组件,已经介绍了两个,这一节介绍ContentProvider.前面的广播可以进行 app内的通讯,如果需要进行app之间的通讯,在android 中使用的是ContentProvider.ContentProvider 也分为三种,一,作为数据的存储和查询,也就是别人来调用你ContentProvider.二,调用者ContentRes

  • Kotlin ContentProvider使用方法介绍

    目录 1.注册ContentProvider 2.内容URI 内容URI的标准格式 通配符 3.创建自己的ContentProvider 4.访问其他程序中的数据 1.注册ContentProvider 右击com.example.myapplication包->New->Other->Content Provider.会弹出窗口 点击finish,完成创建ContentProvider类,这时你可以在注册代码中看到 <provider android:name=".My

  • Kotlin匿名函数使用介绍

    目录 1.函数的声明 2.函数参数 3.Unit函数 4.匿名函数 5.匿名函数的参数 6.lambda表达式 7.定义参数 8.匿名函数 9.函数的引用 10.函数类型作为返回类型 1.函数的声明 kotlin中函数的声明和java中有所不同. 1)得有fun关键字修饰, 2)参数的声明方式和变量声明类似 age:Int,先写参数名,后面跟着参数类型 3)  返回值类型写在参数的后面. //可见性修饰符 函数关键字 方法法名 参数名 参数类型 返回值 private fun functionN

  • Android LeakCanary的使用方法介绍

    目录 1.LeakCanary 如何自动初始化 2.LeakCanary如何检测内存泄漏 2.1LeakCanary初始化时做了什么 2.2LeakCanary如何触发检测 2.3LeakCanary如何检测泄漏的对象 2.4弱引用 WeakReference 1.LeakCanary 如何自动初始化 LeakCanary只需添加依赖就可以实现自动初始化.LeakCanary是通过ContentProvider实现初始化的,在ContentProvider 的 onCreate方法中初始化Lea

  • hadoop动态增加和删除节点方法介绍

    上一篇文章中我们介绍了Hadoop编程基于MR程序实现倒排索引示例的有关内容,这里我们看看如何在Hadoop中动态地增加和删除节点(DataNode). 假设集群操作系统均为:CentOS 6.7 x64 Hadoop版本为:2.6.3 一.动态增加DataNode 1.准备新的DataNode节点机器,配置SSH互信,可以直接复制已有DataNode中.ssh目录中的authorized_keys和id_rsa 2.复制Hadoop运行目录.hdfs目录及tmp目录至新的DataNode 3.

  • docker连接spring boot和mysql容器方法介绍

    在之前使用docker部署运行了Spring Boot的小例子,但是没有使用数据库.在这一篇中,介绍docker如何启动mysql容器,以及如何将Spring Boot容器与mysql容器连接起来运行. docker基本命令 首先熟悉一下在操作过程中常用的docker基本命令: docker images:列出所有docker镜像 docker ps:列出所有运行中的容器,-a参数可以列出所有容器,包括停止的 docker stop container_id:停止容器 docker start

  • Tomcat并发优化方法介绍

    Tomcat 常用运行模式有3种,分别为 bio,nio,apr.生产环境建议用apr,详细请看上一篇博文<Tomcat之--运行模式> 安装APR [root@liuyazhuang ~]# yum -y install apr apr-devel openssl-devel [root@liuyazhuang ~]# tar zxvf tomcat-native.tar.gz [root@liuyazhuang ~]# cd tomcat-native-1.1.24-src/jni/nat

  • JBoss5.x下配置Log4j方法介绍

    最近在学习JBoss下配置Log4j,JBoss的各个版本的目录.JBoss和Log4j集成的文件名每次都有变化,在JBoss5.x下配置了log4j.xml文件,但是配置没有生效.如果你在项目中没有指定使用的log4j的配置文件,最好使用JBoss自带的配置文件,文件名为jboss-log4j.xml.该文件在Jboss容器的目录为:${JBOSS_HOME}\server\default\conf下.下面就是基于log4j默认配置的一些基本修改和注释: <span style="fon

  • oracle中通配符和运算符的使用方法介绍

    用于where比较条件的有: 等于:=.<.<=.>.>=.<> 包含:in.not in exists.not exists 范围:between...and.not between....and 匹配测试:like.not like Null测试:is null.is not null 布尔链接:and.or.not 通配符: 在where子句中,通配符可与like条件一起使用.在Oracle中: %(百分号): 用来表示任意数量的字符,或者可能根本没有字符. _(

  • Oracle RMAN自动备份控制文件方法介绍

    RMAN(Recovery Manager)是一种用于备份(backup).还原(restore)和恢复(recover) 数据库的 Oracle 工具.RMAN只能用于ORACLE8或更高的版本中.它能够备份整个数据库或数据库部件,如表空间.数据文件.控制文件.归档文件以及Spfile参数文件.RMAN也允许您进行增量数据块级别的备份,增量RMAN备份是时间和空间有效的,因为他们只备份自上次备份以来有变化的那些数据块.而且,通过RMAN提供的接口,第三方的备份与恢复软件如veritas将提供更

随机推荐