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不同)访问的,在 ...
随机推荐
- JVM 内存分配和垃圾回收(GC)机制
一 判断对象是否存活 垃圾收集器在对堆进行回收前,第一件事情就是要确定这些对象之中哪些还“活着”,哪些已经"死去”,即不能再被任何途径使用的对象. 1.1 引用计数法 (Reference ...
- android黑科技系列——获取加固后应用App的所有方法信息
一.前言 在逆向应用的时候,我们有时候希望能够快速定位到应用的关键方法,在之前我已经详细介绍了一个自己研发的代码动态注入工具icodetools,来进行动态注入日志信息到应用中,不了解的同学可以查看这 ...
- [Android]异常7-Error:Configuration with name 'default' not found.
背景:使用SVN更新代码,运行出现 异常原因: 可能一>缺少Modules 解决办法有: 解决一>Android Studio切换为Project,settings.gradle中引用和现 ...
- 初识关系型数据库(SQL)与非关系型数据库(NOSQL)
一.关系型数据库(SQL): Mysql,oracle 特点:数据和数据之间,表和字段之间,表和表之间是存在关系的 例如:部门表 001部分, 员工表 001 用户表,用户名.密码 分类表 和 商 ...
- [Windows Server 2003] 安装PHP+MySQL方法
★ 欢迎来到[护卫神·V课堂],网站地址:http://v.huweishen.com★ 护卫神·V课堂 是护卫神旗下专业提供服务器教学视频的网站,每周更新视频.★ 本节我们将带领大家:PHP+MyS ...
- k[原创]Faster R-CNN论文翻译
物体检测论文翻译系列: 建议从前往后看,这些论文之间具有明显的延续性和递进性. R-CNN SPP-net Fast R-CNN Faster R-CNN Faster R-CNN论文翻译 原文地 ...
- JS 获得节点
var ele = ev.parentNode; var elem_child = ele.childNodes; in elem_child) { //遍历子元素数组 if (elem_child[ ...
- redis在linux下安装以及扩展
安装过redis后发现回头忘了,今天重新安装记录下 首先 我是在home下创建redis文件 mkdir redis 然后直接用wget安装 wget http://download.redis ...
- win10安装mysql 8.0.11
mysql安装包可到官网下载,地址:https://dev.mysql.com/downloads/mysql 1.首先解压文件包,我这解压到E:\install_work\mysql目录下: 2.发 ...
- 通过JS唤醒app(安卓+ios)
有需求说要通过页面按钮唤醒app,或者手机上没有这款app跳转到商店,然后刚开始也是查了资料的,结果发现一头雾水,不过最后还是捣鼓出来了,当然也参考了前人分享的经验,下面我就将方法整理一下: 首先明确 ...