Android ContentProvider的使用

ContentProvider是Android中的一个组件,用于实现应用程序之间的数据共享。它提供了一种标准化的接口,允许应用程序访问和操作其他应用程序的数据。ContentProvider可以提供对数据的增删改查操作,并支持跨进程的数据共享。

下面是使用ContentProvider的一般步骤:

1、创建ContentProvider 类

创建一个继承自ContentProvider的子类,并实现必要的方法,如query()insert()update()delete()等。

  • query()方法用于查询数据,返回一个Cursor对象,其中包含查询结果。
  • insert()方法用于插入数据,返回一个表示新插入数据的URI。
  • update()方法用于更新数据,返回受影响的行数。
  • delete()方法用于删除数据,返回受影响的行数。

这些方法的参数包括Uri对象,用于标识要操作的数据,以及其他必要的参数,如查询条件、更新数据等。

class MyContentProvider : ContentProvider() {
    override fun query(
        uri: Uri,
        projection: Array<String>?,
        selection: String?,
        selectionArgs: Array<String>?,
        sortOrder: String?
    ): Cursor? {
        // 处理查询操作
        // ...
        return cursor
    }

    override fun insert(uri: Uri, values: ContentValues?): Uri? {
        // 处理插入操作
        // ...
        return newUri
    }

    override fun update(
        uri: Uri,
        values: ContentValues?,
        selection: String?,
        selectionArgs: Array<String>?
    ): Int {
        // 处理更新操作
        // ...
        return affectedRows
    }

    override fun delete(uri: Uri, selection: String?, selectionArgs: Array<String>?): Int {
        // 处理删除操作
        // ...
        return affectedRows
    }

    // 其他方法
    // ...
}

}

2. 在AndroidManifest.xml中注册ContentProvider

<application>标签内部,添加一个<provider>标签来注册ContentProvider。指定android:name属性为ContentProvider子类的完整类名,并设置其他必要的属性,如android:authorities用于标识ContentProvider的权限。

  • android:name属性:指定ContentProvider子类的完整类名。
  • android:authorities属性:用于标识ContentProvider的权限,一般为包名加上一个唯一的标识符。
  • 其他属性:根据需要设置其他属性,如android:exported表示ContentProvider是否可以被其他应用程序访问。
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.myapp">

    <application
        // ...
        <provider
            android:name=".MyContentProvider"
            android:authorities="com.example.myapp.provider"
            // 其他属性
            />
    </application>

</manifest>


3、实现URI

定义URI用于标识ContentProvider的数据。URI由三部分组成:content://作为前缀,authority用于标识ContentProvider的权限,以及可选的路径。

  • content://:URI的前缀,用于标识ContentProvider。
  • authority:ContentProvider的权限,与注册时指定的android:authorities属性相同。
  • 路径:可选的路径,用于进一步标识数据。

可以通过Uri.parse()方法将字符串转换为Uri对象,如:Uri uri = Uri.parse("content://com.example.myapp.provider/data");

object MyContract {
    const val AUTHORITY = "com.example.myapp.provider"
    val CONTENT_URI: Uri = Uri.parse("content://$AUTHORITY/data")
}

4、使用ContentResolver访问ContentProvider

在其他应用程序中,可以使用ContentResolver类来访问ContentProvider。通过调用ContentResolver的方法,如query()insert()update()delete()等,传入指定的URI和其他参数来操作数据。

val cursor: Cursor? = contentResolver.query(MyContract.CONTENT_URI, null, null, null, null)
// 处理查询结果
// ...

5、ContentObserver的使用

ContentObserver是Android中的一个类,用于监听ContentProvider的数据变化。当ContentProvider中的数据发生变化时,ContentObserver可以收到通知,并执行相应的操作。ContentObserver可以用于实时更新UI、同步数据等场景。

1.创建ContentObserver子类:创建一个继承自ContentObserver的子类,并重写onChange()方法。onChange()方法会在ContentProvider中的数据发生变化时被调用。

class MyContentObserver(handler: Handler) : ContentObserver(handler) {
    override fun onChange(selfChange: Boolean) {
        // 处理数据变化的操作
        // ...
    }
}

2.注册ContentObserver:通过调用ContentResolverregisterContentObserver()方法来注册ContentObserver。传入要监听的URI、是否监听子路径、ContentObserver对象以及可选的标志。

val contentResolver: ContentResolver = context.contentResolver
contentResolver.registerContentObserver(uri, notifyForDescendants, contentObserver)

  • uri:要监听的URI,可以是整个ContentProvider的URI,也可以是指定的某个数据的URI。
  • notifyForDescendants:是否监听子路径,如果为true,则当指定的URI或其子路径发生变化时,ContentObserver会收到通知。
  • contentObserver:要注册的ContentObserver对象。
  • 标志:可选的标志,用于指定观察者行为的额外选项。
  1. 取消注册ContentObserver:当不再需要监听ContentProvider的数据变化时,可以调用ContentResolverunregisterContentObserver()方法来取消注册。
contentResolver.unregisterContentObserver(contentObserver)

最后

如果想要成为架构师或想突破20~30K薪资范畴,那就不要局限在编码,业务,要会选型、扩展,提升编程思维。此外,良好的职业规划也很重要,学习的习惯很重要,但是最重要的还是要能持之以恒,任何不能坚持落实的计划都是空谈。

如果你没有方向,这里给大家分享一套由阿里高级架构师编写的《Android八大模块进阶笔记》,帮大家将杂乱、零散、碎片化的知识进行体系化的整理,让大家系统而高效地掌握Android开发的各个知识点。
img
相对于我们平时看的碎片化内容,这份笔记的知识点更系统化,更容易理解和记忆,是严格按照知识体系编排的。

欢迎大家一键三连支持,若需要文中资料,直接扫描文末CSDN官方认证微信卡片免费领取↓↓↓

PS:群里还设有ChatGPT机器人,可以解答大家在工作上或者是技术上的问题
图片

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值