Android 组件ContentProvider
Android 组件ContentProvider
Android的数据存储有五种方式Shared Preferences、网络存储、文件存储、外储存储、SQLite,一般这些存储都仅仅是在单独的一个应用程序之中达到一个数据的共享,有时候我们须要操作其它应用程序的一些数据,比如常见系统里的通讯录,短信,照片等等,所以云存储,通讯录。艳照门等等就孕育而生了。ContentProvider能够理解成内容提供者。也能够理解为一个接口,就是提供了一个供外部訪问的接口。有的时候须要进行权限控制。
ContentProvider简单介绍
ContentProvider向我们提供了我们在应用程序之前共享数据的一种机制,而我们知道每个应用程序都是执行在不同的应用程序的。不同程序的之间数据共享是现实的须要。程序总不能使闭环的,Android中的ContentProvider外共享数据的优点是统一了数据的訪问方式。简单总结说下:
ContentProvider为存储和获取数据提供了统一的接口。ContentProvide对数据进行封装。不用关心数据存储的细节。使用表的形式来组织数据。
使用ContentProvider能够在不同的应用程序之间共享数据。
Android为常见的一些数据提供了默认的ContentProvider(包含音频、视频、图片和通讯录等)。
说到了ContentProvider这么多优点,不能不说下Uri(Universal Resource Identifier)注意不是URL。通用资源标识符,看个简单的读取联系人的Uri,content://contacts/people,
content://是前缀。固定的;contacts 主机名(或叫Authority)用于唯一标识这个ContentProvider,外部调用者能够依据这个标识来调用。people 路径(path)表示我们要操作的数据,路径的构建依据业务而定。
自己定义ContentProvider
俗话说。欲善其事必先利其器,想要成为一个内容提供者,就先须要有数据,先建立一个SqlDbConncetion:
01.publicclassSqlDBConnection
extendsSQLiteOpenHelper {02. 03.privatestaticfinalString DbName ="Book.db";04.privatestaticintversion=1;05. 06.publicSqlDBConnection(Context context) {07.super(context, DbName,null, version);08.}09. 10.@Override11.publicvoidonCreate(SQLiteDatabase db) {12.// TODO Auto-generated method stub13.String sqlString="create table Book (id integer primary key autoincrement,Name nvarchar(200),Title
nvarchar(200))";14.db.execSQL(sqlString);15.}16. 17.@Override18.publicvoidonUpgrade(SQLiteDatabase db,intoldVersion,
intnewVersion) {19.// TODO Auto-generated method stub20.}21.}上篇文章讲的junit測试这个时候能够拿过来使用一下初始化下数据:
01.publicclassBookCase
extendsAndroidTestCase {02. 03.publicvoidIntial() {04.SqlDBConnection dbConnection =newSqlDBConnection(getContext());05.SQLiteDatabase sqlDataBase = dbConnection.getWritableDatabase();06.longrow =0;07.for(inti =
0; i <5; i++) {08.ContentValues values =newContentValues();09.values.put("Name","书籍"+i);10.values.put("Title","标题"+
i);11.row = sqlDataBase.insert("Book",null,
values);12.Log.i("BookCase","插入成功:"+
row);13.}14.}15.}前面是基础工作,这个时候就能够建立一个自己的ContentProvider:
主机名是须要自己去AndroidManifest.xml文件里自己配置的,要求是唯一的,最好是用包名就好:
1.<provider android:name="com.example.googlecontentprovider.MyContentProvider"2.android:authorities="com.example.googlecontentprovider.MyContentProvider"></provider>假设认为上面的那一串代码不是非常好理解,以下调用的时候我会分别解释。
ContentResolver的使用
方法写在一个应用程序中调用属于正常,在另外一个程序中调用该程序的方法就是类似于接口了,以下先看原来初始化的数据:

又一次新建一个Android測试项目,定义为BookCase,首先插入数据,定义一个Uri。这里面主机名就是上面定义的包名。book/insert与CONTENT_INSERT是相应的:
01.publicvoidbookInsert() {02.Uri uri = Uri04.ContentResolver resolver = getContext().getContentResolver();05.ContentValues values =newContentValues();06.values.put("Name","书籍5");07.values.put("Title","标题5");08.uri = resolver.insert(uri, values);09.Log.i("BookCase","Uri"+
uri);10.longid = ContentUris.parseId(uri);11.Log.i("BookCase","測试成功"+
id);12.}显示结果例如以下:

然后更新刚才插入的数据,相同的更具Code给Uri赋值,然后初始化一个ContentResolver。调用update方法:
01.publicvoidbookUpdate() {02.Uri uri = Uri04.ContentResolver resolver = getContext().getContentResolver();05.ContentValues values=newContentValues();06.values.put("Name","改动");07.intcount = resolver.update(uri, values," id=?
"
,newString[]{"10"});08.Log.i("BookCase","更新了"+
count + "行");09.}结果例如以下:

删除插入的数据:
01.publicvoidbookDelete() {02.Uri uri = Uri04.ContentResolver resolver = getContext().getContentResolver();05.String where =" id=?
"
;06.String[] argString = {"10"};07.intcount = resolver.delete(uri, where, argString);08.Log.i("BookCase","删除了"+
count + "行");09.}结果例如以下:

查询全部的数据:
01.publicvoidbookQuery() {02.Uri uri = Uri04.ContentResolver resolver = getContext().getContentResolver();05.Cursor cursor=resolver.query(uri,newString[]{"id","Name","Title"},null,null,null);06.if(cursor.getCount()>0) {07.while(cursor.moveToNext()) {08.intid=cursor.getInt(cursor.getColumnIndex("Id"));09.String nameString=cursor.getString(cursor.getColumnIndex("Name"));10.String titleString=cursor.getString(cursor.getColumnIndex("Title"));11.Log.i("BookCase", id+"---"+nameString+"---"+titleString);12.}13.}14. 15.}Log下的记录:

查询单条记录:
01.publicvoidbookQuerySingle() {02.Uri uri = Uri04.ContentResolver resolver = getContext().getContentResolver();05.uri=ContentUris.withAppendedId(uri,1);06.Cursor cursor=resolver.query(uri,newString[]{"id","Name","Title"},null,null,null);07.if(cursor.getCount()>0) {08.while(cursor.moveToNext()) {09.intid=cursor.getInt(cursor.getColumnIndex("Id"));10.String nameString=cursor.getString(cursor.getColumnIndex("Name"));11.String titleString=cursor.getString(cursor.getColumnIndex("Title"));12.Log.i("BookCase", id+"---"+nameString+"---"+titleString);13.}14.}15.}结果如图:

Android 组件ContentProvider的更多相关文章
- Android组件系列----ContentProvider内容提供者
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...
- Android组件的通讯——Intent
转载:Android组件的通讯-Intent 1.概述 一个应用程序的三个核心组件——activities.services.broadcast receivers,都是通过叫做intents的消息激 ...
- 23、从头学Android之ContentProvider .
http://blog.csdn.net/jiahui524/article/details/7016430 应用场景: 在Android官方指出的Android的数据存储方式总共有五种,分别是:Sh ...
- 【Android开发日记】之入门篇(十二)——Android组件间的数据传输
组件我们有了,那么我们缺少一个组件之间传递信息的渠道.利用Intent做载体,这是一个王道的做法.还有呢,可以利用文件系统来做数据共享.也可以使用Application设置全局数据,利用组件来进行控制 ...
- 【Android开发精要笔记】Android组件模型解析
Android组件模型解析 Android中的Mashup 将应用切分成不同类别的组件,通过统一的定位模型和接口标准将他们整合在一起,来共同完成某项任务.在Android的Mashup模式下,每个组件 ...
- Android之ContentProvider数据存储
一.ContentProvider保存数据介绍 一个程序可以通过实现一个ContentProvider的抽象接口将自己的数据完全暴露出去,而且ContentProvider是以类似数据库中表的方式将数 ...
- 2015最流行的Android组件、工具、框架大全
Android 是目前最流行的移动操作系统之一. 随着新版本的不断发布, Android的功能也日益强大, 涌现了很多流行的应用程序, 也催生了一大批的优秀的组件. 本文试图将目前流行的组件收集起来以 ...
- Android组件化
附:Android组件化和插件化开发 App组件化与业务拆分那些事 Android项目架构之业务组件化 Android组件化核心之路由实现 Android组件化开发实践
- Android组件安全
今天在看有关Android组件安全的东西 1.Activity Android系统组件在指定Intent过滤器(intent-filter)后,默认是可以被外部程序(签名不同,用户ID不同)访问的,在 ...
随机推荐
- java中 数组 list map之间的互转
三者之间转换关系,一张图清晰呈现. 上代码: 其中的maputils是apache的collection包. package util; import java.util.ArrayList; imp ...
- 在Mac安装Scheme
我也不知道安装的是Scheme这门语言还是编程环境还是其他的什么东西,反正能在控制台运行Scheme代码了.... 谁能告诉我怎么在sublime使用scheme.... 原地址 首先下载安装MIT- ...
- Nrpe 插件安装教程
Nrpe 插件安装教程 blog地址: http://www.cnblogs.com/caoguo 一.nagios plugins的安装 [root@Nrpe ~]# yum install -y ...
- Centos安装smokeping教程
Centos安装smokeping教程 一 .安装基本依赖包 ntpdate time.windows.com #64bit rpm -Uhv http://apt.sw.be/redhat/el6/ ...
- Find the build UUID in a Crash Report
1) Find the build UUID in a Crash Report The first line in the "Binary Images:" section of ...
- Python 之web动态服务器
webServer.py代码如下: import socket import sys from multiprocessing import Process class WSGIServer(obje ...
- animation与transition区别
transition: 过渡属性 过渡所需要时间 过渡动画函数 过渡延迟时间:默认值分别为:all 0 ease 0 1.局限性: 1)只能设置一个属性 2)需要伪类/事件触发才执行 3)只能设置动画 ...
- Vim 写 C/C++ 的配置
.vimrc 2018/08/08 更新 基本的配置,缩进显示行号等 给每个 C/C++ 文件添加头部,显示作者,文件创建时间 F5 编译执行 C/C++源代码 Ctrl + F 利用用 astyle ...
- 第四节:Web爬虫之pyquery解析库
PyQuery库也是一个非常强大又灵活的网页解析库,如果你有前端开发经验的,都应该接触过jQuery,那么PyQuery就是你非常绝佳的选择,PyQuery 是 Python 仿照 jQuery 的严 ...
- hdu2014 青年歌手大奖赛_评委会打分【C++】
青年歌手大奖赛_评委会打分 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tot ...