栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

从零开始学安卓(kotlin)七——跨程序共享数据

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

从零开始学安卓(kotlin)七——跨程序共享数据

目录
  • ContentProvider技术
    • 运行时权限
    • 访问其他程序中的数据
    • 创建自己的ContentProvider

ContentProvider技术

允许一个程序访问另一个程序中的数据,同时还能保证被访问数据的安全性。目前,使 用ContentProvider是Android实现跨程序共享数据的标准方式。

运行时权限
  • 险权限。准确地讲,其实还有一 些特殊权限,不过这些权限使用得相对较少。
  • 普通权限指的是 那些不会直接威胁到用户的安全和隐私的权限,对于这部分权限申请,系统会自动帮我们进行 授权,不需要用户手动操作,比如在BroadcastTest项目中申请的权限就是普通权限。
  • 危险权限则表示那些可能会触及用户隐私或者对设备安全性造成影响的权限,如获取设备联系人信息、定位设备的地理位置等,对于这部分权限申请,必须由用户手动授权才可以,否则程序就无法使用相应的功能。
  • 表格中每个危险权限都属于一个权限组,我们在进行运行时权限处理时使用的是权 限名。原则上,用户一旦同意了某个权限申请之后,同组的其他权限也会被系统自动授权。但 是请谨记,不要基于此规则来实现任何功能逻辑,因为Android系统随时有可能调整权限的分 组。
访问其他程序中的数据

借助 ContentResolver类,可以通过Context中的getContentResolver()方法获取该类的实 例。ContentResolver中提供了一系列的方法用于对数据进行增删改查操作,其中insert() 方法用于添加数据,update()方法用于更新数据,delete()方法用于删除数据,query()方 法用于查询数据。
个参数被称为内容URI。内容URI给ContentProvider中的数据建立 了唯一标识符,它主要由两部分组成:authority和path。authority是用于对不同的应用程序 做区分的,一般为了避免冲突,会采用应用包名的方式进行命名。比如某个应用的包名是 com.example.app,那么该应用对应的authority就可以命名为 com.example.app.provider。path则是用于对同一应用程序中不同的表做区分的,通常会添 加到authority的后面。比如某个应用的数据库里存在两张表table1和table2,这时就可以将 path分别命名为/table1和/table2,然后把authority和path进行组合,内容URI就变成了 com.example.app.provider/table1和com.example.app.provider/table2。不过,目前还 很难辨认出这两个字符串就是两个内容URI,我们还需要在字符串的头部加上协议声明。因此, 内容URI最标准的格式如下:

content://com.example.app.provider/table1
content://com.example.app.provider/table2

只需要调用Uri.parse()方法,就可以将内容URI字符串解析成Uri对象了

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

查询完成后返回的仍然是一个Cursor对象,这时我们就可以将数据从Cursor对象中逐个读取 出来了。读取的思路仍然是通过移动游标的位置遍历Cursor的所有行,然后取出每一行中相应 列的数据。

while (cursor.moveToNext()) {
    val column1 = cursor.getString(cursor.getColumnIndex("column1"))
    val column2 = cursor.getInt(cursor.getColumnIndex("column2"))
}
cursor.close()
创建自己的ContentProvider

如果想要实现跨程序共享数据的功能,可以通过新建一个类去继承 ContentProvider的方式来实现。ContentProvider类中有6个抽象方法,我们在使用子类继承 它的时候,需要将这6个方法全部重写。

class MyProvider : ContentProvider() {
    override fun onCreate(): Boolean {
        return false
}
    override fun query(uri: Uri, projection: Array?, selection: String?,
            selectionArgs: Array?, 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?): Int {
		return 0 }
    override fun delete(uri: Uri, selection: String?, selectionArgs: Array?): Int {
        return 0
}
    override fun getType(uri: Uri): String? {
        return null
} }

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/827481.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号