- Android 系统概述
- 什么是智能手机?智能手机操作系统有哪些?
- Android(安卓)是什么?
- Android 系统架构(图解)
- Android 7 新特性介绍
- Android 开发环境搭建
- Android 开发环境搭建教程(图解)
- Android SDK 是什么?
- 通过 Android Studio 创建 Android 应用程序(附带解析)
- Android Studio 的基本调试
- Android 应用程序结构:Android 组件和资源详解
- Android 四大核心组件:Activity+Service+BroadcastReceiver+ContentProvider
- Android Activity 组件及其生命周期
- Android 资源(res 和 assets 目录)
- AndroidManifest.xml 配置文件详解
- Android App Widgets 组件详解
- Android 系统的进程和线程
- Android GUI(图形用户界面)开发
- Android View 和 ViewGroup
- Android 使用 XML 文件定义用户界面
- Android 五大布局:FrameLayout、LinearLayout、AbsoluteLayout、RelativeLayout 和 TableLayout
- Android 创建 Widget 组件实例详解
- Android Button:按钮控件
- Android CheckBox:多选按钮控件
- Android RadioGroup:单选按钮控件
- Android TextView:文本框控件
- Android EditText:编辑框控件
- Android Spinner:下拉列表控件
- Android AutoCompleteTextView:自动完成文本框控件
- Android DatePicker 和 TimePicker:时间日期选择器
- Android ProgressBar:进度条控件
- Android ScrollView:滚动视图
- Android SeekBar:拖动条控件
- Android RatingBar:评价条控件
- Android ImageView 和 ImageButton:图片视图和图片按钮
- Android ImageSwitcher 和 Gallery:图片切换器和图库
- Android GridView:网格视图
- Android Tab:面板标签控件
- Android 菜单:选项菜单+上下文菜单+子菜单
- Android Bitmap(点阵图像、绘制图像)
- Android 对话框(AlertDialog+ProgressDialog)
- Android 多窗口模式(分屏模式)
- Android 事件监听器和回调方法
- Android 电话短信拍照开发教程
- Android Intent:不同应用程序之间通信的桥梁
- Android 实现拨打电话功能
- Android 实现接收短信和发送短信功能
- Android 调用相机进行拍照
- Android 多媒体开发
- Android Service 生命周期和使用方法
- Android BroadcastReceiver:接收广播
- Android 音频以及音频播放器开发实例
- Android MediaRecorder 录制音频
- Android 视频以及视频播放器实例
- Android Camera 相机以及相机程序开发实例
- Android MediaRecorder 录制视频
- Android 数据存储(SQLite 数据库、Android App 数据备份和恢复 )
- Android 数据存储之 SharedPreferences
- Android 数据存储之文件存储
- Android 使用 SQLite 数据库存数数据
- Android SQLite 数据库操作实例
- Android ContentProvider(内容提供者)
- Android 使用系统提供的 ContentProvider
- Android 自定义 ContentProvider
- Android 使用自定义 ContentProvider
- Google App Engine 是什么?
- Android APP 数据备份与恢复
- Android BackupAgent 实现数据备份与恢复
- Android BackupAgentHelper 实现数据备份与恢复
- Android 网络编程
- 借助 GPE 让 Android APP 和 Google App Engine 通信
- Android HTTP 通信
- Android HttpURLConnection 访问互联网资源
- Android 通过 GET 方式获取互联网资源
- Android 通过 POST 方式获取互联网资源
- Android Socket 编程(附带实例)
- Bluetooth(蓝牙)是什么?
- Android 蓝牙通信开发教程(详解版)
- Android 蓝牙通信开发实例演示
- WIFI(无线局域网)是什么?
- Android WiFi 开发(WiFi 编程)实例演示
- WIFI Direct(WIFI 直连)是什么?
- Android WIFI Direct 开发教程
- Android WIFI Direct 开发实例演示
- NFC(近场通信)是什么?
- Android NFC 开发教程
- Android USB 开发简介
- Android USB 附件模式开发教程
- Android USB 主机模式开发教程
- Android SIP 开发教程
- Android 智能传感器
- LBS(位置服务)和 GPS(全球定位系统)简介
- Android LBS 位置服务开发简介
- Android GPS 定位开发教程
- Google Map API 开发简介
- Android Google Map API Key 详细申请步骤
- Google Map API 开发 Android 地图应用实例
- Android 传感器开发教程
- Android 运动传感器开发教程
- Android 位置传感器开发教程
- Android 环境传感器开发教程
- Android 绘图(2D 绘图、3D 绘图)
- Android 2D 绘图开发简介
- Android 使用自定义 View 绘图
- Android 使用 Bitmap 绘图
- Android 使用 SurfaceView 绘制静态图像
- Android 使用 SurfaceView 绘制动态图像
- Android Drawable 开发简介
- Android 3D 绘图开发简介
- Android 硬件加速开发简介
- Android RenderScript 开发简介
- Android App 的国际化和本地化
- Android 国际化和本地化开发简介
- Android 手机区域设置详细步骤
- Android 未本地化应用开发教程
- Android 本地化应用开发教程
- Android 文本输入与复制粘贴
- Android 剪贴板框架开发简介
- Android 剪贴板数据转文本开发简介
- Android 复制粘贴开发教程
- Android Content Provider 复制复杂数据开发教程
- Android 一键复制粘贴开发实例
- Android 企业级应用开发
- Android 设备管理 API 概述
- Android 开发设备管理 API 应用教程
- Android 文本语音 API 开发教程
- Android TV 应用开发教程
- Android TV 应用开发实例
- Android 可穿戴设备应用开发教程
- Android 应用程序的发布
- Android 应用程序发布的步骤
- Android 为什么要为应用程序签名?
- Android 导出未签名应用程序开发步骤
- Android 生成签名文件开发教程
- Android 应用程序签名开发教程
- zipalign 工具优化应用程序开发简介
- Google Play Store( Android Market)发布简介
Android ContentProvider(内容提供者)
ContentProvider 是 Android 的四大组件之一,用于保存和检索数据,是 Android 系统中不同应用程序之间共享数据的接口。
在 Android 系统中,应用程序之间是相互独立的,分别运行在自己的进程中,相互之间没有数据交换。若应用程序之间需要共享数据,就要用到 ContentProvider。
在 Android 系统的手机中,ContentProvider 最典型的应用是,当发送一条短信时,需要用到联系人的相关信息,此时就是通过 ContentProvider 提供的接口访问 Android 系统中的电话簿,并从中选择联系人。
ContentProvider 提供了一组应用程序之间能相互访问的接口。应用程序通过 ContentProvider 把当前应用中的数据共享给其他应用程序访问,而其他应用程序通过 ContentProvider 对指定应用中的数据进行访问和操作。
Android 系统对一系列常见的公用数据类型提供了对应的 ContentProvider 接口,例如视频、音频、图像、个人通信信息等,都定义在 android.provider 包下。
若应用程序开发者想将自己的数据公开给其他应用程序使用,有两种方法:
- 定义自己的 ContentProvider 子类。
- 将当前应用程序的数据添加到已有的 ContentProvider 中。
ContentProvider 中的数据在形式上和关系数据库中的表格很相似。
以 Android 系统内建的用户常用词典所对应的 ContentProvider 为例,Android 系统为其定义的名字为 android.provider.UserDictionary,该用户词典中的 Word 表格记录了特定用户经常使用的不规则单次的相关信息。其数据格式如下表所示。
word | appId | frequency | locale | _ID |
---|---|---|---|---|
manpreduce | user1 | 100 | en_US | 1 |
precompiler | user14 | 200 | fr_FR | 2 |
applet | user2 | 225 | fr_CA | 3 |
const | user1 | 255 | pt_BR | 4 |
int | user5 | 100 | en_UK | 5 |
表头部分存储在 ContentProvider 中,表格的每一行是该词典数据的一个实例,也就是一个非标准的单词,每一列是和该单词相关的一些信息,例如该单词的拼写、使用者的 id、使用频率等,_ID 起到了主键的作用。
应用程序通过 ContentResolver 的对象访问 ContentProvider 中的数据,该对象提供了对持久层数据的 CRUD 方法。
每个 Activity 都有一个 ContentResolver 对象,要获取该对象,可以使用 Activity 提供的 getContentResolver() 方法。
当然,应用程序要使用其他应用程序提供的 ContentProvider,需要拥有进行操作的相应权限。所有用户词典数据的代码为:
mCursor=getContentResolver().query(UserDictionary.Words.CONTENT_URI,null,null,null,null)
其所对应的权限为:android.permission.READ_USER_DICTIONARY,因此必须在应用程序的 AndroidManifest.xml 文件中添加:
<uses-permission android:name="android.permission.READ_USER_DICTIONARY">
UserDictionary.Words.CONTENT_URI 指的是用户词典中 words 表的内容 URI。
ContentProvider 通过 URI 来共享数据。URI 是一个通用资源标志符,可将其分为 A、B、C、D 共 4 部分。
- A:无法改变的标准前缀,包括“content://”“tel://”等。当前缀是“content://”时,说明在通过一个 ContentProvider 控制这些数据。
- B:URI 的授权部分,一般为 ContentProvider 的全称,它通过 Android:authorities 属性声明,用于说明是哪个 ContentProvider 类提供这些数据,必须全部由小写字母组成,如 content://introduction.android.myprovider。
- C:路径,可以理解为需要操作的数据库中表的名字,如“content:// introduction. android.myprovider /name”中的 name。
- D:若 URI 中包含表示需要获取记录的 ID,则返回该 ID 对应的数据,若没有 ID,则表示返回全部数据,如 content://introduction.android.myprovider/name/01。
在本实例中,UserDictionary.Words.CONTENT_URI 包含所要访问 ContentProvider 的标识和具体信息表的路径。
其所代表的完整的字符串是“content://user_dictionary/words”,其中“content://”是前置格式字符串,即 A 部分;“user_dictionary”指定了提供数据的 ContentProvider,即 B 部分;“words”指定了要访问的数据表,即 C 部分。
此外,ContentProvider 允许通过在 URI 后面添加 ID 值的方式访问数据表中某一列数据,即添加 D 部分。例如,访问用户词典 words 表中 _ID=2 的数据的 URI 可以这样表示:
Uri singleUri=ContentUri.withAppendedId(UserDictionary.Words.CONTENT_URI,2);
其对应的完整 URI 为:“content://user_dictionary/words/2”。
ContentProvider 定义在 android.content 包下面,是一个抽象类。定义一个 Content Provider 必须实现下面几个抽象方法。
方法名称 | 作用 |
---|---|
onCreate() | 用于在启动时初始化 ContentProvider。由于该方法会在应用程序的主线程启动时被调用,因此不应该执行耗时的操作,以免延迟应用程序的启动时间。执行成功返回 true,失败返回 false。 |
query(Uri,String[],String,String[],String) | 用于对 Uri 指定的 ContentProvider 进行查询,返回一个 Cursor 对象。 |
insert(Uri, ContentValues) | 用于添加数据到 Uri 指定的 ContentProvider 中。 |
update(Uri, ContentValues, String, String[]) | 用于更新 Uri 指定的 ContentProvider 中的数据。 |
delete(Uri, String, String[]) | 用于从 Uri 指定的 ContentProvider 中删除数据。 |
getType(Uri) | 用于返回 Uri 指定的 ContentProvider 中的数据的 MIME 类型。 |
ContentResolver 提供的方法和 ContentProvider 提供的方法相对应,主要有以下几个方法。
方法名称 | 作用 |
---|---|
query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) | 用于对 Uri 指定的 ContentProvider 进行查询。 |
insert(Uri uri, ContentValues values) | 用于添加数据到 Uri 指定的 ContentProvider 中。 |
delete(Uri uri, String selection, String[] selectionArgs) | 用于从 Uri 指定的 ContentProvider 中删除数据。 |
update(Uri uri, ContentValues values, String selection, String[] selectionArgs) | 用于更新 Uri 指定的 ContentProvider 中的数据。 |
在对某特定 ContentProvider 的 CRUD 操作中,通过 ContentResolver 提供的 CRUD 方法将相关信息传递给 ContentProvider,所提供的 CRUD 方法进而对数据进行操作。
因此,在定义自己的 ContentProvider 时,应该定义好该 ContentProvider 对数据进行 CRUD 操作时所使用的方法。
UriMatcher
Android 系统提供了 UriMatcher 类用于对 URI 的匹配。
使用步骤为:
1)创建 UriMatcher 类对象。
2)通过 UriMatcher.addURI(String,String,int) 方法对其增加需要匹配的 URI 路径,所对应的匹配码由第三个参数指定。
3)通过 UriMatcher.match(Uri) 方法进行匹配,并返回匹配码。
其代码如下:
UriMatcher uriMatcher=new UriMatcher (UriMatcher.NO_MATCH) ; //构建 UriMatcher 对象,常量 UriMatcher .NO_MATCH 表示不匹配任何路径,返回码-1 //添加需要匹配的 URI,并指定匹配时返回的匹配码 UriMatcher.addURI ("introdcuton.android.myprovider", "text", 1) ; //荣国 match() 方法匹配 content://introdcuton .android.myprovider/text/230 //路径,对应匹配码为 2 uriMatcher.addURI ("introdcuton.android.myprovider", "text/#", 2) ; //#号为通配符,如果 match() 方法匹配 content://introdcuton.android.myprovider/text/230 //路径,对应匹配码为 2 Uri uri=Uri.parse ("content://introdcuton.android.myprovider/text/10") ; switch (uriMatcher.match (uri)) { case 1: //匹配操作码为 1 //执行相应操作 break; case 2: //匹配返回码为 2 //执行相应的操作 break; default: //不匹配 //执行相应的操作 break; }
上述代码中,uriMatcher.addURI("introdcuton.android.myprovider","text/#",2) 中“#”为通配符,代表任意数字,还可以使用通配符“*”来代表任意文本。这句话表示,若传入的 URI 能够匹配“content://introdcuton.android.myprovider/text/ 数字”格式,则返回匹配码 2。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论