Android开发学习笔记:浅谈Content Provider
一.Content Provider的概念介绍
Content Providers是所有应用程序之间数据存储和检索的桥梁,它使得各个应用程序之间实现数据共享。是应用程序间共享数据的唯一途径。Content Provider 主要的功能就是存储并检索数据以及向其他应用程序提供访问数据的接口。其中包括添加,删除,查询,更新等操作。
在Content Provider使用过程中,还需要借用ContentResolver对象间接来操作ContentProvider来获取数据。ContentResolver通过应用程序的getContentResolver()方法获得。一般情况下,ContentResolver是单实例的,但是可以有多个ContentResolver在不用的应用程序和不同的进程之间和ContentResolver交互。
二.Content Provider的简介
1.Content Provider的常用方法
- //查询
- query(Uri, String[], String, String[], String);
- //插入
- insert(Uri, ContentValues);
- //更新
- update(Uri, ContentValues, String, String[]);
- //删除
- delete(Uri, String, String[]);
- //获得MIME数据类型
- getType(Uri);
2.数据模型
Content Provider 将其存储的数据以数据表的形式提供给访问者,在数据表中每一行为一条记录,每一列为具有特定类型和意义的数据。每一条数据记录都包括一个 "_ID" 数值字段,改字段唯一标识一条数据。
_ID |
NUMBER |
NUMBER_KEY |
LABEL |
NAME |
TYPE |
13 |
(425) 555 6677 |
425 555 6677 |
Kirkland office |
Bully Pulpit |
TYPE_WORK |
44 |
(212) 555-1234 |
212 555 1234 |
NY apartment |
Alan Vain |
TYPE_HOME |
45 |
(212) 555-6657 |
212 555 6657 |
Downtown office |
Alan Vain |
TYPE_MOBILE |
53 |
201.555.4433 |
201 555 4433 |
Love Nest |
Rex Cars |
TYPE_HOME |
3.URI
URI,每一个Content Provider 都对外提供一个能够唯一标识自己数据集(data set)的URI, 如果一个Content Provider管理多个数据集,其将会为每个数据集分配一个独立的URI。Content Provider就是通过URI对象来共享其数据的。
URI的格式图如下:
各个部分的组成:
A:标准前缀,是固定的,"content://"是用来标识数据是由Content Provider管理的 schema。
B:URI的标识,它定义了是哪个Content Provider提供这些数据。对于第三方应用程序,为了保证URI标识的唯一性,它必须是一个完整的、小写的类名。这个标识在 元素的 authorities属性中说明:一般是定义该ContentProvider的包.类的名称
C:需要访问的数据字段名称。
D:如果URI中包含表示需要获取的记录的_ID;如何有D部分,则就返回该_ID对应的数据,否则表示返回整张表的数据
三.Content Provider实例
Anroid系统自带的Content Provider对象
获得系统联系人信息(姓名和手机号码)的例子
MainActivity.java
- package com.lingdududu.provide;
- import android.app.Activity;
- import android.os.Bundle;
- import android.provider.ContactsContract;
- import android.provider.ContactsContract.PhoneLookup;
- import android.database.Cursor;
- import android.graphics.Color;
- import android.widget.TextView;
- import android.content.ContentResolver;
- public class MainActivity extends Activity {
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- TextView tv = new TextView(this);
- String string = getQueryData();
- // 设置文本的颜色
- tv.setTextColor(Color.BLUE);
- // 设置TextView显示的内容
- tv.setText(string);
- //设置文本字体的大小
- tv.setTextSize(30.0f);
- // 显示到屏幕
- setContentView(tv);
- }
- public String getQueryData(){
- String string = "";
- // 得到ContentResolver对象
- ContentResolver cr = getContentResolver();
- // 取得电话本中开始一项的光标
- Cursor cursor = cr.query(ContactsContract.Contacts.CONTENT_URI, null,
- null, null, null);
- // 向下移动光标
- while (cursor.moveToNext()) {
- // 取得联系人名字
- int nameFieldColumnIndex = cursor
- .getColumnIndex(PhoneLookup.DISPLAY_NAME);
- String contact = cursor.getString(nameFieldColumnIndex);
- // 取得电话号码
- String ContactId = cursor.getString(cursor
- .getColumnIndex(ContactsContract.Contacts._ID));
- Cursor phone = cr.query(
- ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,
- ContactsContract.CommonDataKinds.Phone.CONTACT_ID + "="
- + ContactId, null, null);
- while (phone.moveToNext()) {
- String PhoneNumber = phone
- .getString(phone
- .getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
- string += (contact + ":" + PhoneNumber + "\n");
- }
- }
- cursor.close();
- return string;
- }
- }
注意:记得在AndroidManifest.xml加上17行的权限声明
- <?xml version="1.0" encoding="utf-8"?>
- <manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.lingdududu.provide"
- android:versionCode="1"
- android:versionName="1.0">
- <uses-sdk android:minSdkVersion="10" />
- <application android:icon="@drawable/icon" android:label="@string/app_name">
- <activity android:name=".MainActivity"
- android:label="@string/app_name">
- <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>
通讯录中联系人的信息:
效果图:
转载于:https://blog.51cto.com/liangruijun/667264
Android开发学习笔记:浅谈Content Provider相关推荐
- Android 开发学习笔记
Android 开发学习笔记 Lesson1 (2.28) android之父: Andy Rubin(安迪 鲁宾) Lesson2 (3.3) android 的优点: 开放.网络接入自由.丰富的硬 ...
- Android 开发学习笔记:七大知识点板块汇总
前言 我从事 Android 开发行业也有些年头,工作期间也接触过很多 Android 开发者, 因此也非常清楚 程序员最大的限制并非年龄而是实力: 但大多数初中级Android工程师,想要提升技能, ...
- Android开发学习笔记(二)——编译和运行原理(2)
上篇介绍了应用程序从源码到安装包的整个过程,考虑到篇幅过长,遂将原理内容分成两部分来介绍.接下来,在本篇中,主要介绍Android平台应用程序的运行原理. 在阅读了SDK文档中"Applic ...
- Android开发学习笔记---搭建Android开发环境
今天突发奇想,想看看Android开发是什么样的,于是就在度娘了一下Android开发,便自己动手搭建了起来.中间也碰到了一些问题,自己慢慢度娘,谷哥去解决.现在把搭建步骤记录如下: 第一步:下载Ec ...
- 学习笔记--浅谈LoRa与LoRaWAN
浅谈LoRa与LoRaWAN 1.什么是LoRa LoRa是semtech公司创建的低功耗局域网无线标准,低功耗一般很难覆盖远距离,远距离一般功耗高,要想马儿不吃草还要跑得远,好像难以办到. LoRa ...
- [Linux学习笔记] 浅谈信号(文章含不少学习资源)
百金买骏马,千金买美人,万金买爵禄,何处买青春? 目录 信号的概念 信号的种类: kill -l 命令可以查看信号列表 man 7 signal 查看信号详细内容 信号的产生 补充知识 Core Du ...
- Android开发学习笔记
2022.3.10 android开发笔记 Lesson4(3.10web). 作业: 手写MainAcitivity.java与activity_ main.xml 文件 res目录. 存放资源:图 ...
- Android开发学习笔记(二)——编译和运行原理(1)
接着上一篇的内容,继续从全局了解Android.在清楚了Android的平台架构(可以看作是静态原理)后,还需要掌握其动态原理.动态原理包含两部分,一部分是编译原理,另一部分是运行原理.有人会说,搭建 ...
- 【Android开发学习笔记之一】5大布局方式详解
Android中常用的5大布局方式有以下几种: 线性布局(LinearLayout):按照垂直或者水平方向布局的组件. 帧布局(FrameLayout):组件从屏幕左上方布局组件. 表格布局(Tabl ...
最新文章
- 科普:WiFi是谁申请的专利?高通吗?错!
- wxWidgets:wxSashEvent类用法
- Delphi 10.X 不用联接真机或模拟器编译出APK
- 关于CNN的权重共享,CNN到底学到了什么?
- java创建线程几种_java中创建线程有几种方式
- python static 的用法_Python中static相关知识小结
- 国土空间规划中工作底图如何制作
- Flutter中使用友盟统计
- UESTC 2014 Summer Training #19
- oracle 11g 静默安装
- gif 动态加载_搞笑GIF:这个游戏最大的成功就是失败!
- 图解自监督学习,从入门到专家必读的九篇论文
- STM32F407外部晶体改为25M后检测不到芯片的解决办法
- 【系列二之图像处理系列】波形处理(3)
- Java从json串中获取某个值
- linux删除mysql用户_如何删除MySQL用户帐户
- 实例(C++解一元二次方程)
- flutter Image.network()网络图片加载失败,404错误的异常处理和解决方法初探
- 王道考研计算机网络第三章--数据链路层
- [Android UI界面] Android UI 设计准则
热门文章
- 9.struts1.x中tiles框架的使用
- Indy中判断邮件来源
- matlab柱状斜线_Matlab小练习:按斜线方向依次赋值矩阵
- java返回两个string_java – 为什么String.intern()方法返回两个不同的结果?
- php函数从数组中取出指定的数目,PHP数组函数
- 1055 - Expression #1 of SELECT list is not in GROUP BY clause and contains解决
- jvm什么是本地方法
- h2 mysql 兼容_H2内存数据库对sql语句的支持问题 sql放到mysql数据库中能跑
- 教你理清SpringBoot与SpringMVC的关系
- 【实用】C#测试web服务是否可用