四大组件之一 内容提供者 content providers/Uri含义

Content provider

内容提供程序有助于应用管理其自身和其他应用所存储数据的访问,并提供与其他应用共享数据的方法。它们会封装数据,并提供用于定义数据安全性的机制。内容提供程序是一种标准接口,可将一个进程中的数据与另一个进程中运行的代码进行连。实现内容提供程序大有好处。最重要的是,通过配置内容提供程序,您可以使其他应用安全地访问和修改您的应用数据。
在这里插入图片描述
如果您计划共享数据,则可使用内容提供程序。如果您不打算共享数据,也可使用内容提供程序,因为它们可以提供很好的抽象,但无需如此。此抽象可让您修改应用数据存储实现,同时不会影响依赖数据访问的其他现有应用。在此情况下,受影响的只有您的内容提供程序,而非访问该提供程序的应用。例如,您可以将 SQLite 数据库换成其他存储空间。
在这里插入图片描述
内容提供程序可用于管理对各种数据存储源的访问,包括结构化数据(如 SQLite 关系型数据库)和非结构化数据(如图像文件)。如需了解 Android 可用存储类型的详细信息,请参阅存储选项和设计数据存储。

内容提供程序的优点

内容提供程序可精细控制数据访问权限。您可以选择仅在应用内限制对内容提供程序的访问,授予访问其他应用数据的权限,或配置读取和写入数据的不同权限。如需了解有关安全使用内容提供程序的更多信息,请参阅存储数据的安全提示与内容提供程序权限。
您可以使用内容提供程序将细节抽象化,以用于访问应用中的不同数据源。例如,您的应用可能会在 SQLite 数据库中存储结构化记录,以及视频和音频文件。如果您在应用中实现此开发模式,则可使用内容提供程序访问所有这类数据。

内容提供程序基础知识

内容提供程序管理对中央数据存储区的访问。提供程序是 Android 应用的一部分,通常提供自己的界面来处理数据。但是,内容提供程序主要目的是供其他应用使用,这些应用使用提供程序客户端对象进行访问。提供程序与提供程序客户端共同提供一致的标准数据界面,该界面还可处理进程间通信并保护数据访问的安全性。
通常,您会在以下两种场景中使用内容提供程序:一种是通过实现代码访问其他应用中的现有内容提供程序;另一种是在应用中创建新的内容提供程序,从而与其他应用共享数据。本主题介绍使用现有内容提供程序的基础知识。如需详细了解如何在自己的应用中实现内容提供程序,请参阅创建内容提供程序。
本主题介绍以下内容:

  • 内容提供程序的工作方式。
  • 用于从内容提供程序检索数据的 API。
  • 用于在内容提供程序中插入、更新或删除数据的 API。
  • 其他有助于使用内容提供程序的 API 功能。

创建内容提供程序

内容提供程序管理对中央数据存储区的访问。如要实现提供程序,您需将其作为 Android 应用中的一个或多个类,以及清单文件中的元素。其中一个类会实现子类 ContentProvider,即提供程序与其他应用之间的接口。尽管内容提供程序旨在向其他应用提供数据,但您应用中的某些 Activity 必定允许用户查询和修改提供程序所管理的数据。

本主题的其余部分列出了开发内容提供程序的基本步骤和需要使用的 API。

Content provider实战

在应用启动时就会执行Manifest中注册的Content Provider.
打印日志看启动顺序的话,Content Provider的注册甚至在Application onCreate之前。

2023-02-21 16:36:35.289 27664-27664/cn.jj.jjserver I/JJWorld.UserInfoProvider: UserInfoProvider onCreate...
2023-02-21 16:36:35.291 27664-27664/cn.jj.jjserver I/JJWorld.JJApplication: JJApplication onCreate
2023-02-21 16:36:35.376 27664-27664/cn.jj.jjserver I/JJWorld.MainActivity: MainActivity onCreate...

在应用之间共享数据

跨进程通信的一种方式

ContentProvider为APP存取内部数据提供统一的外部接口,让不同的应用之间得以共享数据。
在这里插入图片描述

Uri含义

   *  URI的格式:content://authority/data_path/id
     *  content:// 通用前缀,表示该Uri用于ContentProvider定位资源
     *  authority 授权者名称,用来确定具体时哪一个ContentProvider提供资源。因此,一般authority都是有类的小写权成组成
     *  以确保唯一
     *  data_path 数据路径,用来确定请求的是哪个数据集,可以是数据库名
     *  id 数据编号,用来请求单条数据 如果是多条这个字段忽略
@Override
    public Uri insert(Uri uri, ContentValues values) {
   
   
        /**
         *  URI: 通用资源标识符 Universal Resource Identifier
         *  每一个Content Provider都有一个唯一的地址。
         *
         *  URI的格式:content://authority/data_path/id
         *  content:// 通用前缀,表示该Uri用于ContentProvider定位资源
         *  authority 授权者名称,用来确定具体时哪一个ContentProvider提供资源。因此,一般authority都是有类的小写权成组成
         *  以确保唯一
         *  data_path 数据路径,用来确定请求的是哪个数据集
         *  id 数据编号,用来请求单条数据 如果是多条这个字段忽略
          */
        SQLiteDatabase db = userDBHelper.getWritableDatabase();
        db.insert(UserDBHelper.TABLE_NAME,null,values);
        return uri;
    }

ContentResolver

// 传递给 ContentResolver 一个值Uri后,ContentResolver找Android系统,Android系统去找对应于Uri的contentProvider

ContentProvider案例

Client App将用户的输入内容,通过Content Provider跨进程通信传递给Server App。Server的服务端中创建contentProvider。在这里插入图片描述

Server AndroidManifest中声明provider
        <provider
            android:name=".provider.UserInfoProvider"
            android:authorities="cn.jj.jjserver.provider.UserInfoProvider"
            android:enabled="true"
            android:exported="true" />
Server端 提供content provider

Uri的定义如下图所示,可以使用Uri.parse方式获取uri。

public class UserInfoContent {
   
   
    public static final String AUTHORITIES = "cn.jj.jjserver.provider.UserInfoProvider";
    // user为访问的数据库名
    public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITIES + "/user");

    // 下面是该表的各个字段名称
    public static final String USER_NAME = "name";
    public static fina
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学知识拯救世界

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值