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.privatestaticfinal
String DbName ="Book.db";
04.privatestaticint
version=1;
05. 
06.publicSqlDBConnection(Context context) {
07.super(context, DbName,null, version);
08.}
09. 
10.@Override
11.publicvoidonCreate(SQLiteDatabase db) {
12.// TODO Auto-generated method stub
13.String sqlString="create table Book (id integer primary key autoincrement,Name nvarchar(200),Title
nvarchar(200))"
;
14.db.execSQL(sqlString);
15.}
16. 
17.@Override
18.publicvoidonUpgrade(SQLiteDatabase db,intoldVersion,
intnewVersion) {
19.// TODO Auto-generated method stub
20.}
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 = Uri
04.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 = Uri
04.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 = Uri
04.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 = Uri
04.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 = Uri
04.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的更多相关文章

  1. Android组件系列----ContentProvider内容提供者

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

  2. Android组件的通讯——Intent

    转载:Android组件的通讯-Intent 1.概述 一个应用程序的三个核心组件——activities.services.broadcast receivers,都是通过叫做intents的消息激 ...

  3. 23、从头学Android之ContentProvider .

    http://blog.csdn.net/jiahui524/article/details/7016430 应用场景: 在Android官方指出的Android的数据存储方式总共有五种,分别是:Sh ...

  4. 【Android开发日记】之入门篇(十二)——Android组件间的数据传输

    组件我们有了,那么我们缺少一个组件之间传递信息的渠道.利用Intent做载体,这是一个王道的做法.还有呢,可以利用文件系统来做数据共享.也可以使用Application设置全局数据,利用组件来进行控制 ...

  5. 【Android开发精要笔记】Android组件模型解析

    Android组件模型解析 Android中的Mashup 将应用切分成不同类别的组件,通过统一的定位模型和接口标准将他们整合在一起,来共同完成某项任务.在Android的Mashup模式下,每个组件 ...

  6. Android之ContentProvider数据存储

    一.ContentProvider保存数据介绍 一个程序可以通过实现一个ContentProvider的抽象接口将自己的数据完全暴露出去,而且ContentProvider是以类似数据库中表的方式将数 ...

  7. 2015最流行的Android组件、工具、框架大全

    Android 是目前最流行的移动操作系统之一. 随着新版本的不断发布, Android的功能也日益强大, 涌现了很多流行的应用程序, 也催生了一大批的优秀的组件. 本文试图将目前流行的组件收集起来以 ...

  8. Android组件化

    附:Android组件化和插件化开发 App组件化与业务拆分那些事 Android项目架构之业务组件化 Android组件化核心之路由实现 Android组件化开发实践

  9. Android组件安全

    今天在看有关Android组件安全的东西 1.Activity Android系统组件在指定Intent过滤器(intent-filter)后,默认是可以被外部程序(签名不同,用户ID不同)访问的,在 ...

随机推荐

  1. 单例模式在多线程环境下的lazy模式为什么要加两个if(instance==null)

    刚才在看阿寻的博客”C#设计模式学习笔记-单例模式“时,发现了评论里有几个人在问单例模式在多线程环境下为什么lazy模式要加两个if进行判断,评论中的一个哥们剑过不留痕,给他们写了一个demo来告诉他 ...

  2. 来自一个用户的体验-Alpha项目测试

    软件梦之队成员:201731062305 周蓉 这个作业属于哪个课程 <课程的链接> 这个作业要求在哪里 <作业要求的链接> 团队名称 <软件梦之队>(附上团队博客 ...

  3. java设计模式02观察者模式

    观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能够自动更新自己. 这里主要讲一下学习内置观察者的记录,在JA ...

  4. Nrpe 插件安装教程

    Nrpe 插件安装教程  blog地址: http://www.cnblogs.com/caoguo 一.nagios plugins的安装 [root@Nrpe ~]# yum install -y ...

  5. day41 网络编程

    目录 网络架构 单机架构 CS架构 BS架构 互联网和互联网的组成(教材版) 边缘部分: 核心部分: 互联网的组成 硬件 软件 打开网页的过程(科普版) 物理层 数据链路层 网络层 传输层 抽象层 网 ...

  6. iptables详解(4):iptables匹配条件总结之一

    所属分类:IPtables  Linux基础 在本博客中,从理论到实践,系统的介绍了iptables,如果你想要从头开始了解iptables,可以查看iptables文章列表,直达链接如下 iptab ...

  7. sysbench使用指南

    sysbench 安装.使用和测试 摘要: sysbench是一个开源的.模块化的.跨平台的多线程性能测试工具,可以用来进行CPU.内存.磁盘I/O.线程.数据库的性能测试.目前支持的数据库有MySQ ...

  8. 2. Python中的基本输入、输出、格式化

    本文利用的是Python 3.x版本,建议学习3.x版本 Python中的基本输入.输出.格式化 1. 输入 使用input([prompt])读取一行,将其转换为string类型并返回,input的 ...

  9. 第四节:Web爬虫之pyquery解析库

    PyQuery库也是一个非常强大又灵活的网页解析库,如果你有前端开发经验的,都应该接触过jQuery,那么PyQuery就是你非常绝佳的选择,PyQuery 是 Python 仿照 jQuery 的严 ...

  10. jquery源码分析(七)——事件模块 event(二)

    上一章节探讨了事件的一些概念,接下来看下jQuery的事件模块. jQuery对事件的绑定分别有几个API:.bind()/.live()/.delegate()/.on()/click(), 不管是 ...