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. Spring Cloud (13) 服务网关-路由配置

    传统路由配置 所谓传统路由配置方式就是在不依赖于服务发现机制情况下,通过在配置文件中具体制定每个路由表达式与服务实例的映射关系来实现API网关对外部请求的路由.没有Eureka服务治理框架帮助的时候, ...

  2. Spring Cloud (10) Hystrix-监控面板

    Hystrix DashBoard 断路器是根据一段时间窗内的请求状况来判断并操作断路器的打开和关闭状态的.Hystrix Dashboard是作为断路器状态的一个组件,提供了数据监控和友好的图形化界 ...

  3. Python3之format

    print('{0},{1}'.format('zhangk', 32)) print('{},{},{}'.format('zhangk','boy',32)) print('{name},{sex ...

  4. 02--SQLite操作一步到位

    SQLite数据库(一):基本操作 SQLite 是一个开源的嵌入式关系数据库,实现自包容.零配置.支持事务的SQL数据库引擎. 其特点是高度便携.使用方便.结构紧凑.高效.可靠. 与其他数据库管理系 ...

  5. html5——表单

    type类型 email //输入email格式 tel //手机号码 url //只能输入url格式 number //只能输入数字 search //搜索框 range //范围 滑动条 colo ...

  6. async await 同步方法调用异步方法死锁

    同步方法调用异步方法.GetAwaiter().GetResult()计算函数超时,异步方法所有的回调操作都会期望返回到主线程. 所以会导致各种线程死锁.异步方法中使用ConfigureAwait(f ...

  7. 汇编:MSR/MRS/BIC指令

    1.MRS指令MRS指令的格式为:MRS{条件}   通用寄存器,程序状态寄存器(CPSR或SPSR)MRS指令用于将程序状态寄存器的内容传送到通用寄存器中.该指令一般用在以下两种情冴: Ⅰ.当需要改 ...

  8. CAD向控件注册一个命令(com接口VB语言)

    主要用到函数说明: MxDrawXCustomFunction::Mx_RegistUserCustomCommand 向控件注册一个命令,用户在命令行输入命令名这个字符串,就会触发执行命令事件 命令 ...

  9. Django - 数据获取

    Django - 数据获取 1.radio值获取 2.checkbox获取 3.select 获取 select 获取值,需要根据前端multiple来获取,get or getlist; 4.上传文 ...

  10. String s = new String("xyz");创建了几个对象?

    两个或一个都有可能 . ”xyz”对应一个对象,这个对象放在字符串常量池,常量”xyz”不管出现多少遍,都是常量池中的那一个. new String每写一遍,就创建一个新的对象,它使用常量”xyz”对 ...