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. 一篇文章告诉你如何使用EF CodeFirst做增删改查

    一.修改数据 其实修改涉及的内容挺多的,是相对于其他操作来说比较繁琐.也是本文的重头戏. 虽然都是基础内容,但是也是值得细细品味的. 1.最简单直接的修改数据就是从数据库里检索出数据修改相应的字段即可 ...

  2. Leetcode0133--Clone Graph 克隆无向图

    [转载请注明]:https://www.cnblogs.com/igoslly/p/9699791.html 一.题目 二.题目分析 给出一个无向图,其中保证每点之间均有连接,给出原图中的一个点 no ...

  3. JQuery文档加载完成执行js的几种方法

    js中文档加载完毕.一般在body加一个onload事件或者window.onload = function () {} jQuery中有好多写法,平时也不注意,别人一问,还真觉得头大. 下面是我整理 ...

  4. 解决Mysql Workbench的Error Code: 1175错误

    错误: Error Code: 1175. You are using safe update mode and you tried to update a table without a WHERE ...

  5. http://blog.csdn.net/pizi0475/article/details/48286579 -------------(Collada 快速入门)

    http://blog.csdn.net/zhouhangjay/article/details/8469085 说明:Collada的文件格式,中文版的很少,在csdn上看到了一个Sleepy的,感 ...

  6. ThinkPHP框架表单验证AJAX

    验证有两种方式:静态验证与动态验证. 一.静态验证 在模型类里面预先定义好该模型的自动验证规则,我们称为静态定义. 验证时要在test表的Model里面加验证条件:新建testModel.class. ...

  7. centos7安装个人网盘owncloud

    现在个人资料越来越重要,网络速度也已经满足日常需要,网盘已经是生活着存取个人数据不可缺少的工具. 下面在linxu centos7下面安装owncloud搭建自己私人网盘: 1.新建一个账号用来安装个 ...

  8. 转:LINQ教程一:LINQ简介

    原文地址:https://www.cnblogs.com/dotnet261010/p/8278793.html 一.为什么要使用LINQ 要理解为什么使用LINQ,先来看下面一个例子.假设有一个整数 ...

  9. [forward]警惕UNIX下的LD_PRELOAD环境变量

    From: https://blog.csdn.net/haoel/article/details/1602108 警惕UNIX下的LD_PRELOAD环境变量 前言 也许这个话题并不新鲜,因为LD_ ...

  10. C++ 数据结构模板 队列 栈 动态链表 模板 Queue Stack List

    C++数据结构模板,可以实现基本功能,用法和stl差不多,比如Q.pop();Q.push(a);Q.front();...... (由于动态链表用的不多,若有错误望各位大神不吝赐教:) 队列: cl ...