- 浏览: 240443 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
xchd:
分别在什么时候(情况下)用ThreadFactory、Exec ...
Executor线程池实例 -
mikey_5:
是不是没有写完啊
Executor线程池实例 -
xinyao:
楼主,你好,请问能给我发个源码吗,我要在一个页面能实时看到下载 ...
Android学习系列(19)--App离线下载 -
sdtzkj:
...
jasperReport 帮助文档 api -
shero_ys:
public class VrowsePicActivity ...
android handler 实现三步曲
初识ContentProvider
在第6章当中,介绍了组成Android程序的主要4部分,它们分别是。
Activity。
Broadcast Intent Receiver。
Service。
Content Provider。
关于Actvity和相关View的部分,已经在前边章节进行了比较详细的介绍,在这一节中,将学习Android应用里另外一个非常重要的部分ContentProvider。
1.什么是ContentProvider
Android这个系统和其他的操作系统还不太一样,读者需要记住的是,数据在Android当中是私有的,当然这些数据包括文件数据和数据库数据以及一些其他类型的数据。那这个时候有读者就会提出问题,难道两个程序之间就没有办法对于数据进行交换?Android这么优秀的系统不会让这种情况发生的。解决这个问题主要靠ContentProvider。一个Content Provider类实现了一组标准的方法接口,从而能够让其他的应用保存或读取此Content Provider的各种数据类型。也就是说,一个程序可以通过实现一个Content Provider的抽象接口将自己的数据暴露出去。外界根本看不到,也不用看到这个应用暴露的数据在应用当中是如何存储的,或者是用数据库存储还是用文件存储,还是通过网上获得,这些一切都不重要,重要的是外界可以通过这一套标准及统一的接口和程序里的数据打交道,可以读取程序的数据,也可以删除程序的数据,当然,中间也会涉及一些权限的问题。下边列举一些较常见的接口,这些接口如下所示。
query(Uri uri, String[] projection, String selection, String[] selectionArgs,String sortOrder):通过Uri进行查询,返回一个Cursor。
insert(Uri url, ContentValues values):将一组数据插入到Uri 指定的地方。
update(Uri uri, ContentValues values, String where, String[] selectionArgs):更新Uri指定位置的数据。
delete(Uri url, String where, String[] selectionArgs):删除指定Uri并且符合一定条件的数据。
2.什么是ContentResolver
外界的程序通过ContentResolver接口可以访问ContentProvider提供的数据,在Activity当中通过getContentResolver()可以得到当前应用的ContentResolver实例。ContentResolver提供的接口和ContentProvider中需要实现的接口对应,主要有以下几个。
query(Uri uri, String[] projection, String selection, String[] selectionArgs,String sortOrder):通过Uri进行查询,返回一个Cursor。
insert(Uri url, ContentValues values):将一组数据插入到Uri 指定的地方。
update(Uri uri, ContentValues values, String where, String[] selectionArgs):更新Uri指定位置的数据。
delete(Uri url, String where, String[] selectionArgs):删除指定Uri并且符合一定条件的数据。
3.ContentProvider和ContentResolver中用到的Uri
在ContentProvider和ContentResolver当中用到了Uri的形式通常有两种,一种是指定全部数据,另一种是指定某个ID的数据。我们看下面的例子。
content://contacts/people/ 这个Uri指定的就是全部的联系人数据。
content://contacts/people/1 这个Uri指定的是ID为1的联系人的数据。
在上边两个类中用到的Uri一般由3部分组成。
第一部分是:"content://" 。
第二部分是要获得数据的一个字符串片段。
最后就是ID(如果没有指定ID,那么表示返回全部)。
由于URI通常比较长,而且有时候容易出错,且难以理解。所以,在Android当中定义了一些辅助类,并且定义了一些常量来代替这些长字符串的使用,例如下边的代码:
Contacts.People.CONTENT_URI (联系人的URI)。
使用ContentProvider读取系统数据(1)
在这个例子里边,首先在系统的联系人应用当中插入一些联系人信息,然后把这些联系人的名字和电话再显示出来,通过这个例子可以学到。
如何在联系人应用当中添加联系人。
如何使用系统提供的ContentProvider。
如何使用ContentResolver当中的query()方法。
具体实现步骤如下所示。
1.第一步
在Eclipse中打开ex09_1_ContentProvider项目,具体操作如下。
(1)新建一个项目,依次单击File→New→Android Project项。
(2)在新建项目的对话框中,选择Create project from existing source项。
(3)单击浏览按钮,找到ex09_1_ContentProvider项目,然后单击确定按钮。
程序的目录结构如图8-23所示。
2.第二步
首先运行这个项目,将会看到如图8-24所示的界面。
(点击查看大图)图8-23 程序的目录结构 |
(点击查看大图)图8-24 未添加任何数据的主界面 |
图8-24所示的列表中没有任何数据,接下来的操作是为应用添加几条联系人数据。
3.第三步
按照下列图示添加几条数据到联系人列表中,具体步骤如下。
(1)单击模拟器的Home键,在转出来的界面上,单击桌面上的Contacts应用,如图8-25所示。
(2)进入应用后,单击MENU项,在出现的界面上单击New contact 按钮,如图8-26所示。
使用ContentProvider读取系统数据(2)
(3)添加联系人姓名和电话号码信息,如图8-27所示。
(4)单击MENU项,在返回的界面上单击Save项保存,如图8-28所示。
(点击查看大图)图8-27 添加联系人姓名和电话号码 |
(点击查看大图)图8-28 保存联系人姓名和电话号码信息 |
(5)按照上边的操作步骤,添加了两条数据后显示如图8-29所示。
4.第四步
再次运行程序,模拟器显示如图8-30所示。
(点击查看大图)图8-29 添加后结果 |
(点击查看大图)图8-30 模拟器显示 |
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- Cursor c = getContentResolver().query (Phones.CONTENT_URI, null, null, null, null);
- startManagingCursor(c);
- ListAdapter adapter = new SimpleCursorAdapter(this,
- Android.R.layout.simple_list_item_2, c,
- new String[] { Phones.NAME, Phones.NUMBER },
- new int[] { Android.R.id.text1, Android.R.id.text2 });
- setListAdapter(adapter);
- }
代码解释:
getContentResolver()方法得到应用的ContentResolver实例。
query(Phones.CONTENT_URI, null, null, null, null)。它是ContentResolver里的方法,负责查询所有联系人,并返回一个Cursor。这个方法参数比较多,每个参数的具体含义如下。
第一个参数为Uri,在这个例子里边这个Uri是联系人的Uri。
第二个参数是一个字符串的数组,数组里边的每一个字符串都是数据表中某一列的名字,它指定返回数据表中那些列的值。
第三个参数相当于SQL语句的where部分,描述哪些值是我们需要的。
第四个参数是一个字符串数组,它里边的值依次代替在第三个参数中出现的"?"符号。
第五个参数指定了排序的方式。
startManagingCursor(c)语句让系统来管理生成的Cursor。
ListAdapter adapter = new SimpleCursorAdapter(this,Android.R.layout.simple_list_item_2, c, new String[] { Phones.NAME, Phones.NUMBER }, new int[] { Android.R.id.text1, Android.R.id.text2 })语句生成一个SimpleCursorAdapter。(关于SimpleCursorAdapter我们在第7章已经详细介绍过了。)
setListAdapter(adapter)。将ListView和SimpleCursorAdapter进行绑定。
(点击查看大图)图8-25 单击Contacts应用 |
(点击查看大图)图8-26 单击New contact选项 |
发表评论
-
Android学习系列(19)--App离线下载
2011-08-13 11:40 1426Android学习系列(19)--App离线下载 ... -
Android学习系列(20)-App数据格式之解析Json
2011-08-13 11:28 1639JSON数据格式,在Android中被广泛运用于客户端和网络( ... -
Android学习系列(1)--为App签名(为apk签名)
2011-08-13 11:20 1693写博客是一种快乐,前提是你有所写,与人分享,是另一种快乐, ... -
Android学习系列(4)--App自适应draw9patch不失真背景
2011-08-13 11:16 2230做人要大度,海纳百川,做事要圆滑,左右逢源,这让我想到了编程也 ... -
Android自定义View之一:初探实例 .
2011-08-13 11:09 1496Android自定义View实现很简单 继承View,重写构 ... -
Android多媒体学:播放网络上的视频 .
2011-08-13 11:05 2073Android支持播放网络上的视频。在播放网络上的视频时,牵涉 ... -
Android多媒体学:利用AudioRecord类实现自己的音频录制程序 .
2011-08-13 11:02 5901AudioRecord类相对于MediaRecorder来说, ... -
Android多媒体:实现图像的编辑和合成 .
2011-08-13 10:59 2200package demo.camera; import ja ... -
自动完成框
2011-05-03 13:44 761请下载源码 -
读取sd卡照片
2011-05-03 13:43 1315请下载源码 -
UC菜单栏布局
2011-05-03 13:41 1131请下载附件 -
Executor线程池实例
2011-04-06 17:42 6709Executor 是 java5 下的一个 ... -
android handler 实现三步曲
2011-04-06 16:59 1443一. 要实现接口: public class VrowseP ... -
android 横竖屏切换
2011-03-25 14:33 1940①不理会。。②只竖屏 ... -
android 分辨率调试
2011-03-25 13:36 1874一:不同的layout Android ... -
android 图片内存溢出
2011-03-21 18:24 3106我的代码如下 is = new FileI ... -
android Exid 不可修改
2011-03-21 13:47 1268Android:只读EditText内容可滚动(禁止输入法)的 ... -
android 对话提示框大全
2011-03-21 12:34 3214Android 对话框(Dialog)大全 建立你自己的对话框 ... -
Android消息提示框和对话框
2011-03-21 12:29 1368在某些情况下需要向用户弹出提示消息,如显示错误信息,收到短消息 ... -
android tab 用法
2011-03-11 15:10 1776TabHost广泛运用于android程序中,在程序中运用Ta ...
相关推荐
本教程“mars—第一季android——contentProvider”聚焦于如何利用ContentProvider来实现不同应用程序之间的数据交换。 ContentProvider是Android系统提供的一种机制,允许应用程序将自己的数据公开给其他应用。...
在Android应用开发中,数据存储是至关重要的一个环节,它涉及到用户信息的持久化,使得应用在退出或设备重启后仍能保持之前的状态。在众多的数据存储方式中,SharedPreferences是一种轻量级的选择,尤其适用于存储小...
在Android开发中,数据存储是不可或缺的一部分,它用于保存应用的状态和用户数据。这篇博文将主要探讨SharedPreferences这一轻量级的数据存储方式,它适合存储简单的键值对数据,如设置偏好。通过SharedPreferences...
此外,Android还提供了一个更高级的API——ContentProvider,它允许不同应用程序间共享数据。ContentProvider基于SQLite数据库,提供了一种统一的接口,使得数据的访问更加安全和规范。如果你的应用程序需要与其他...
"安卓Android源码——数据口袋.zip"可能包含的是一个关于数据管理或存储的开源项目,旨在帮助开发者更好地理解和处理Android设备上的数据。这个压缩包很可能是某个开发者的个人实践、教程或者是针对Android平台的...
【Android课程设计——简易闹钟】是一个以Android平台为基础,使用Java 8语言开发的简单应用,主要目标是为了满足课程设计的要求。这个闹钟应用程序包含了几个核心组件和技术,包括本地数据库存储、定时任务调度以及...
本资料包"安卓Android源码——数据的储存与读取.zip"可能包含了一些关于如何在Android平台上存储和检索数据的示例代码和讲解,这将帮助开发者更好地理解这一核心概念。 在Android中,有多种数据存储方式,每种都有...
然后是Android系统库,包含了大量预编译的库文件,如SQLite用于数据存储,OpenSSL用于安全通信,以及OpenGL ES用于图形渲染等。 上一层是Android运行时(ART),这是Android设备上的程序执行环境,包括Dalvik虚拟机...
在这个名为“Android项目之——漂亮的平台书架”的项目中,我们将会探讨如何在Android平台上构建一个美观且功能齐全的电子书架应用。这个项目的核心目标是为用户提供一个友好的界面,让他们可以方便地浏览、搜索和...
7. **ContentProvider**: 在Android中,ContentProvider是数据共享的接口,相册应用可以通过ContentProvider来提供对图片的访问权限,其他应用可以通过Uri查询和操作这些图片。 8. **异步处理**: 图片加载和处理...
【Android课程设计——课程表(app)】 在Android开发领域,设计一款课程表应用是一个常见的实践项目,旨在帮助用户管理他们的学习计划。本项目的核心目标是创建一个简单易用、功能实用的应用,使用户能够方便地...
它是内容提供者的基类,实现了数据的存储和检索。开发者需要继承`ContentProvider`并重写其关键方法,如`query()`, `insert()`, `update()`, `delete()`以及`getType()`,以定义自己的数据操作逻辑。然后在...
《Android毕业设计——成语游戏》是一款基于Android平台的益智类应用,旨在通过游戏的方式让玩家在娱乐中学习和巩固中华传统文化中的成语知识。在这个项目中,开发者运用了Android开发的相关技术,包括UI设计、数据...
“c7”可能与数据存储有关,Android提供了多种数据存储方式,包括Shared Preferences(轻量级键值对存储)、SQLite数据库(结构化数据存储)、内部/外部存储(文件系统存储)。开发者需要根据需求选择合适的数据存储...
【Android项目之——漂亮的平台书架】 在Android开发中,创建一个美观且功能丰富的书架应用是一项挑战,它需要结合用户界面设计、数据管理、触摸交互以及动画效果等多个方面。这个"漂亮的平台书架"项目旨在实现一个...
在本“Android项目实战——手机安全卫士开发案例解析”中,我们将深入探讨如何构建一个类似于手机安全卫士的应用程序,这将涵盖Android应用程序开发的基础和高级概念。在这个项目中,我们将利用Eclipse开发环境,这...
5. **数据存储**:Android提供了多种数据存储方式,如SharedPreferences(轻量级键值对存储)、SQLite数据库(结构化数据存储)、文件系统以及内容提供者。 6. **通知与消息推送**:通过NotificationManager,应用...
【安卓Android源码——jchat4android手机聊天程序】 安卓Android是全球最广泛使用的移动操作系统,它的开源特性使得开发者能够深入研究和定制系统,从而创建出各种各样的应用程序。"jchat4android"是一个专为...
6. **数据存储**:Android提供了SQLite数据库、SharedPreferences、ContentProvider等多种数据存储方式。源码中可能包含这些技术的使用,有助于我们掌握如何在应用中持久化数据。 7. **权限管理**:Android从6.0...