Content Provider用于在不同的应用程序之间实现数据共享。应用程序使用一个ContentResolver对象去操作指定数据。

1 Content Provider概述

Content Provider实现一组通用的方法,用来提供数据的增、删、改、查功能。
应用程序通过调用Activity或其他组件类的getContentResolver()方法来获得ContentResolver对象。例如:

ContentResolver resolver = getContentResolver();

通常,ContentProvider仅有一个实例,该实例能与不同应用程序(不同进程)的多个ContentResolver类对象通信。

使用Content Provider时,通常会用到以下两个概念:

(1)数据模型

使用基于数据库模型的简单表格来记录数据。例如:

_ID

NAME

NUMBER

001

xxx

187xxxxxxxx

002

yyy

156yyyyyyy

003

zzz

131zzzzzzz

查询返回一个Cursor对象,它能遍历各行各列来读取各个字段的值。

(2)URI

每个Content Provider提供URI以唯一标识其数据集。
每个ContentResolver方法使用URI作为其第一个参数,它标识ContentResolver应该使用哪个provider及其中的哪个表格。
下面是Content URI组成:

content://com.android.contacts/contacts/001

[1]content:
标准前缀,表示该数据由Content Provider管理
[2]com.android.contacts:
URI的权限部分,不同应用程序不同。
[3]contacts/001:
用于指定要操作的数据,001表示被请求的特定记录的ID。

2 创建Content Provider

要创建Content Provider,需要:
(1)继承ContentProvider类来提供数据访问方式。
(2)在应用程序的AndroidManifest文件中声明Content Provider。

(1)继承ContentProvider类

意味着要实现ContentProvider类的6个抽象方法:

方法

说明

onCreate()

用于初始化provider

query()

返回数据给调用者

insert()

插入新数据

update()

更新数据

delete()

删除数据

getType()

返回数据MIME类型

由于这些ContentProvider方法能被不同线程或进程的ContentResolver对象调用,所以它们必须以线程安全的方式实现。

(2)声明Content Provider

即在AndroidManifest.xml中定义<provider>元素:

<providerandroid:name = "com.hyh.TestProvider"android.authorities = "com.hyh.testprovider".../>
</provider>

name属性的值是ContentProvider类的子类的名称。
authorities属性是provider定义的content:URI中的authority部分。

3 使用Content Provider

Android系统为常用数据类型提供了预定义的Content Provider,它们大都位于android.provider包中。常见Content Provider如下:

名称
说明
Browser
浏览器信息
CallLog
通话历史信息
Contacts
联系人信息
LiveFolders
由ContentProvider提供内容的特定文件夹
MediaStore
多媒体信息(声音,视频,图片)
Setting
系统设置
SearchRecentSuggestions
为应用程序创建简单的查询建议
UserDictionary
在可预测文本输入时,提供用户定义的单词给输入法使用

代码如下:
MainActivity.java

public class MainActivity extends AppCompatActivity {private final String TAG = "ContentProvider";// 希望获得姓名private String columns = ContactsContract.Contacts.DISPLAY_NAME;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);if(ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED){ActivityCompat.requestPermissions(MainActivity.this, new String[]{ Manifest.permission.READ_CONTACTS}, 1);}setContentView(R.layout.activity_main);// 获得布局文件中的TextView组件TextView tv = (TextView) findViewById(R.id.result);// 为TextView设置数据tv.setText(getQueryData());// Textview添加滚动条tv.setMovementMethod(ScrollingMovementMethod.getInstance());}// 创建getQueryData()方法,实现获取通讯录信息private CharSequence getQueryData() {// 用于保存字符串StringBuilder sb = new StringBuilder();// 获得ContentResolver对象ContentResolver resolver = getContentResolver();// 查询记录Cursor cursor = resolver.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);// 获得姓名记录的索引值int displayNameIndex = cursor.getColumnIndex(columns);// 迭代全部记录for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) {String displayName = cursor.getString(displayNameIndex);sb.append(displayName + "\n");}// 关闭Cursorcursor.close();Log.d(TAG, "2 sb:" + sb);return sb.toString();}
}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><TextViewandroid:id="@+id/result"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textSize="@dimen/textSize"android:lineSpacingExtra="@dimen/lineSpacingExtra"android:paddingLeft="@dimen/paddingLeft"android:paddingTop="@dimen/paddingTop"android:scrollbars="vertical"android:singleLine="false"/></RelativeLayout>

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.hyh.contentprovider"><applicationandroid:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/Theme.ContentProvider"><activity android:name=".MainActivity"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity></application><uses-permission android:name="android.permission.READ_CONTACTS"/></manifest>

[2021.11.20]使用ContentProvider实现数据共享相关推荐

  1. 【不忘初心】Win10_LTSC2021_19044.1381_X64_可更新[纯净精简版][2.52G](2021.11.20)

    此版可正常更新补丁,母版来自UUP WIN10_LTSC2021 19044.1288集成补丁到19044.1381为了保证稳定初心的系统全部都是离线精简和优化,非二次封装.系统纯净.流畅.进程少无任 ...

  2. 尚硅谷——谷粒商城项目开发记录——2021.11.20

    尚硅谷--谷粒商城项目开发记录--2021.11.20 概念: 1.SpringCloud Alibaba: 简介: Spring Cloud Alibaba 致力于提供微服务开发的一站式解决方案.此 ...

  3. 2021.11.20 孤尽训练营D26——分布式锁

    大纲:分布式锁简介.Redis分布式锁分析.Redisson分布式锁.分段锁 简介 在同一个JVM内部,大家往往采用synchronized或者Lock的方式来解决多线程间的安全问题,但是在分布式架构 ...

  4. jQuery快速入门(2)--操作 2021.11.20

    关联查找 1)$dom.parent():找$dom的父节点,相当于dom.parentNode属性 2)$dom.first():$dom集合中的第一个,平行关系 而不是父子关系 与parentNo ...

  5. 2021.11.20关于用递归来解决进制转换

    题目:(c primer plus第六版第九章)为了让程序清单9.8中的to_binary()函数更通用,编写一个to_base_n() 函数接受两个在2-10范围内的参数,然后以第2个参数中指定的进 ...

  6. 2021.11.8-11.14 AI行业周刊(第71期):AI行业经验

    篇章一:行业经验 不同的AI公司,对于AI产品的场景定位不同. 有的公司是面向C端产品.有的公司专门做B端用户. 当然大白所在的公司,也有具体的定位,主要面向智慧金融.智慧机场.智慧城市. 之前,一直 ...

  7. 2021.11.29-12.5 AI行业周刊(第74期):AI公司产品

    篇章一:AI公司产品 上周二去青岛,参加青岛市政府举办的AI百企百景线下资源对接会. 线下来了很多入驻青岛的企业,包括商汤科技,旷视科技,腾讯,科大讯飞,极视角等. 作为线下场景落地的三家典型企业,我 ...

  8. GMOJ - 2021.07.20【普及组】模拟赛C组 - 排座椅(seat)、传球游戏(ball)、立体图(drawing)、间谍派遣、seek

    文章目录 luogu博客链接 GMOJ - 2021.07.20[普及组]模拟赛C组 - 排座椅(seat).传球游戏(ball).立体图(drawing).间谍派遣.seek T1 排座椅(seat ...

  9. 2021.11.22-11.28 AI行业周刊(第73期):工作的需求

    篇章一:工作的需求 最近可能到了年底,很多朋友都在蠢蠢欲动,看外面的机会. 微信上最近每天也有几个朋友,和我实时分享他们最新的动态. 发现一个比较有意思的现象:人生不同阶段的人,求职的需求都比较相似. ...

最新文章

  1. matlab 左除和右除
  2. Visual Studio 快捷键
  3. Unix环境高级编程学习笔记(一)
  4. Storm-源码分析-Topology Submit-Client
  5. Mysql(三)——(cmd)数据库的命令操作
  6. Windows平台下的Redis集群搭建(简单有效)
  7. 【软件测试】《软件测试技术基础》知识点整理
  8. 第13章 集成学习和随机森林 学习笔记上
  9. C语言判断素数的三种方法 判断素数(质数)
  10. 用户故事与敏捷方法—Scrum与用户故事
  11. STM32 电机教程 13 - BLDC 电机转速计算
  12. Mybatis 中事务提交方式
  13. 如何批量将PNG格式转化为JPG格式
  14. zer0pts CTF 2022 VishwaCTF 2022
  15. 报错:Internal error XFS_WANT_CORRUPTED_GOTO at line 1635 of file fs/xfs/libxfs/xfs_alloc.c.
  16. C语言经典面试题10道(七)
  17. linux服务运维管理,Linux服务器运维管理(第2版)
  18. Ubuntu14.10 更新源
  19. 威纶通触摸屏如何隐藏系统设置箭头图标及通过参数进入系统设置?
  20. Lect2 BFS总结

热门文章

  1. 2668: [cqoi2012]交换棋子
  2. 使用go语言画出sin函数图像
  3. 保存DC到bmp图片的两种方法
  4. vcomp140.dll怎么安装?提示vcomp140.dll丢失怎样修复?
  5. 【android】利用Yahoo API完成天气预报
  6. oracle 启动错误1067,oracle监听器启动1067错误处理
  7. Lucky Division
  8. [hihocoder1044]状态压缩一
  9. 如何把带有文字的网址转换成%%E7%BE%8E%E5%B0%91%E5%A5%B3
  10. 分享股票level2行情接口获取美股列表信息的代码