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. java学习笔记_网络

    客户端 import java.io.*; import java.net.*; public class DailyAdviceClient { public void go() { try { S ...

  2. Dancing Links X 学习笔记

    \(\\\) Definitions 双向链表:记录前后两个指针的链表,每个顺序关系都有双向的指针维护. \(Dancing\ Links\):双向十字循环链表,建立在二维关系上,每个元素记录上下左右 ...

  3. [转]Linux下/proc目录简介

    1. /proc目录Linux 内核提供了一种通过 /proc 文件系统,在运行时访问内核内部数据结构.改变内核设置的机制.proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间.它以文 ...

  4. cordova科大讯飞语音识别

    cordova-plugin-IFlyspeech 科大讯飞的语音听说读写的cordova插件 Supported Platforms iOS android Installation 插件安装命令: ...

  5. JS高级——函数的调用模式

    函数调用模式一共有四种 <script> //1.函数模式 //this指向window全局对象 //2.方法模式 //this指向调用这个方法的对象 //3.构造函数模式 //this ...

  6. vue移动端地址三级联动组件(二)

    继续上一篇: 子组件css: <style scoped lang="less"> #city { width: 100%; height: 100%; positio ...

  7. 使用python的几个小经验(查看文档)

    好久没有水博客了,未来再过20天不到的时间又得参加软考,今天终于得好好水一发帖子 关于Python,很多人包括我之前都不知道怎么找文档,现在有一个好办法,就是在命令行模式下调用pydoc –p xxx ...

  8. uva 540 (Team Queue UVA - 540)

    又是一道比较复杂的模拟题.题中有两种队列,一种是总队列,从前向后.其他的是各个团体的小队列,因为入队的人如果有队友的话,会优先进入团体队列. 所以我们先设置两个队列和一个map,设置map倒是可以不用 ...

  9. NFA到DFA实例

    下面图使用NFA表示的状态转换图, 使用子集构造法,有如下过程, ε-closure(0) = {0, 1, 2, 3, 4, 6, 7}初始值,令为AA = {0, 1, 2, 3, 4, 6, 7 ...

  10. PAT 1099. Build A Binary Search Tree (树的中序,层序遍历)

    A Binary Search Tree (BST) is recursively defined as a binary tree which has the following propertie ...