Android 这 13 道 ContentProvider 面试题,你都会了吗?

Android 这 13 道 ContentProvider 面试题,你都会了吗?

前言

作为 Android 的四大组件之一,ContentProvider 可以说是无处不在了。

但是对于我而言,开发过程中看似 ContentProvider 用得很娴熟,却一直没能形成一个完整的体系。

也许大家也有着和我类似的烦恼,于是我特地花了几天的时间,总结了我所知道的知识点,以及面试中可能遇到的问题。将本文分享给大家,希望能帮助大家重新梳理下我们的这个老朋友 ContentProvider 。

最后,希望大家阅读愉快!

文章目录

ContentProvider 应用程序间非常通用的共享数据的一种方式,也是 Android 官方推荐的方式。

Android 中许多系统应用都使用该方式实现数据共享,比如通讯录、短信等。

ContentProvider

方便大家学习,我在 GitHub 上建立个 仓库

仓库内容与博客同步更新。由于我在 稀土掘金 简书 CSDN 博客园 等站点,都有新内容发布。所以大家可以直接关注该仓库,以免错过精彩内容!

仓库地址:
超级干货!精心归纳 Android 、JVM 、算法等,各位帅气的老铁支持一下!给个 Star !

1.1 Android 为什么要设计 ContentProvider 这个组件?

为什么要设计 ContentProvider

很多做 Android 开发的人都不怎么使用它,觉得直接读取数据库会更简单方便。

那么 Android 搞一个内容提供者在数据和应用之间,只是为了装高大上,故弄玄虚?我认为其设计用意在于:

封装。对数据进行封装,提供统一的接口,使用者完全不必关心这些数据是在 DB ,XML 、Preferences 或者网络请求来的。当项目需求要改变数据来源时,使用我们的地方完全不需要修改。

提供一种跨进程数据共享的方式。

应用程序间的数据共享还有另外的一个重要话题,就是数据更新通知机制了。因为数据是在多个应用程序中共享的,当其中一个应用程序改变了这些共享数据的时候,它有责任通知其它应用程序,让它们知道共享数据被修改了,这样它们就可以作相应的处理。

1.2 如何访问自定义 ContentProvider

如何访问自定义 ContentProvider

ContentResolver 接口的 notifyChange 函数来通知那些注册了监控特定 URI的ContentObserver 对象,使得它们可以相应地执行一些处理。

ContentObserver 可以通过 registerContentObserver 进行注册。

通过 ContentProvider 的 Uri 访问开放的数据。

ContenResolver 对象通过 Context 提供的方法 getContenResolver() 来获得。

ContenResolver 提供了以下方法来操作:insert delete update query 这些方法分别会调用 ContenProvider 中与之对应的方法并得到返回的结果。

1.3 通过 ContentResolver 获取 ContentProvider 内容的基本步骤

ContentResolver 获取 ContentProvider 内容的基本步骤

得到 ContentResolver 类对象:ContentResolver cr = getContentResolver ( )。

定义要查询的字段 String 数组。

使用 cr.query() ; 返回一个 Cursor 对象。

使用 while 循环得到 Cursor 里面的内容。

1.4 ContentProvider 是如何实现数据共享的:

ContentProvider 是如何实现数据共享的

在 Android 中如果想将自己应用的数据 ( 一般多为数据库中的数据 ) 提供给第三发应用, 那么我们只能通过 ContentProvider 来实现了。 ContentProvider 是应用程序之间共享数据的接口。

使用的时候首先自定义 一个类继承 ContentProvider , 然后覆写 query 、insert 、update 、delete 等 方法。

因为其是四大组件之一因此必须在 AndroidManifest 文件中进行注册。

把自己的数据通过 uri 的形式共享出去 android 系统下 不同程序 数据默认是不能共享访问 需要去实现一个类去继承 ContentProvider。

public class PersonContentProvider extends ContentProvider{ public boolean onCreate(){ } query(Url, String[], String, String[], String); insert(Uri,ContentValues); update(Uri,ContentValues,String[]); delete(Uri,String,String[]); } 1.5 为什么要用 ContentProvider ?它和 sql 的实现上有什么差别?

为什么要用 ContentProvider ?它和 sql 的实现上有什么差别

ContentProvider 屏蔽了数据存储的细节 , 内部实现对用户完全透明 , 用户只需要关心操作数据的 uri 就可以了, ContentProvider 可以实现不同 app之间 共享。

Sql 也有增删改查的方法, 但是 sql 只能查询本应用下的数据库。

而 ContentProvider 还可以去增删改查本地文件. xml 文件的读取等。

1.6 Uri 介绍

Uri 介绍

为系统的每一个资源给其一个名字,比方说通话记录。

每一个 ContentProvider 都拥有一个公共的 URI ,这个 URI 用于表示这个 ContentProvider 所提供的数据。

Android 所提供的 ContentProvider 都存放在 android.provider 包中。

将其分为 A,B,C,D 4个部分:

A:标准前缀,用来说明一个 Content Provider 控制这些数据,无法改变的;"content://";

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpzzsf.html