- 浏览: 240408 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
xchd:
分别在什么时候(情况下)用ThreadFactory、Exec ...
Executor线程池实例 -
mikey_5:
是不是没有写完啊
Executor线程池实例 -
xinyao:
楼主,你好,请问能给我发个源码吗,我要在一个页面能实时看到下载 ...
Android学习系列(19)--App离线下载 -
sdtzkj:
...
jasperReport 帮助文档 api -
shero_ys:
public class VrowsePicActivity ...
android handler 实现三步曲
在前边的章节当中主要学习关于Android在布局和显示方面的知识,在这一节中将开始学习Android应用的另外一个方面:数据存储。用户可以将自己的数据存储到文件系统或者数据库当中,当然最经常的是,用户将自己的数据存储到SQLite数据库当中。SQLite是Android所带的一个标准的数据库,它支持SQL语句,它是一个轻量级的嵌入式数据库。
在这个例子里边,我们在程序的主界面有一些按钮,通过这些按钮可以对数据库进行标准的增、删、改、查。
通过这个例子我们可以学到:
如何新建一个数据库;
如何新建数据库里边的数据表;
如何删除数据库里边的数据表;
如何在数据表中添加新数据;
如何删除数据库表中的数据;
如何使用Android提供的工具File explore,来查看和删除模拟器当中的数据库表;
如何使用LogCat来看程序当中打印的日志。
1.第一步
在Eclipse中,打开ex08_1_SQLite 项目,具体步骤如下。
新建一个项目。依次单击File→New→Android Project项。
在新建项目的对话框中,选择Create project from existing source项。
单击浏览,找到ex08_1_SQLite项目,然后单击确定。
程序的目录结构如图8-6所示。
2.第二步
单击运行项目,我们可以看到主界面如图8-7所示,这个界面的布局信息都在main.xml文件中,在一个LinearLayout当中数值排列了5个Button。
3.第三步
小知识 什么是SQLiteDatabase?
一个SQLiteDatabase的实例代表了一个SQLite的数据库,通过SQLiteDatabase实例的一些方法,我们可以执行SQL语句,对数据库进行增、删、查、改的操作。需要注意的是,数据库对于一个应用来说是私有的,并且在一个应用当中,数据库的名字也是惟一的。
(点击查看大图)图8-6 程序目录结构图 |
(点击查看大图)图8-7 主界面 |
小知识 什么是SQLiteOpenHelper ?
根据这名字,我们可以看出这个类是一个辅助类。这个类主要生成一个数据库,并对数据库的版本进行管理。当在程序当中调用这个类的方法getWritableDatabase()或者getReadableDatabase()方法的时候,如果当时没有数据,那么Android系统就会自动生成一个数据库。SQLiteOpenHelper 是一个抽象类,我们通常需要继承它,并且实现里边的3个函数,具体函数如下所示。
onCreate(SQLiteDatabase):在数据库第一次生成的时候会调用这个方法,一般我们在这个方法里边生成数据库表。
onUpgrade(SQLiteDatabase, int, int):当数据库需要升级的时候,Android系统会主动的调用这个方法。一般我们在这个方法里边删除数据表,并建立新的数据表,当然是否还需要做其他的操作,完全取决于应用的需求。
onOpen(SQLiteDatabase):这是当打开数据库时的回调函数,一般也不会用到。
我们在ActivityMain文件中看下边这个内部类。DatabaseHelper 类继承SQLiteOpenHelper ,具体代码如下所示:
- private static class DatabaseHelper extends SQLiteOpenHelper {
- DatabaseHelper(Context context) {
- super(context, DATABASE_NAME, null, DATABASE_VERSION);
- }
- @Override
- public void onCreate(SQLiteDatabase db) {
- // SQL语句
- String sql = "CREATE TABLE " + TABLE_NAME + " (" + TITLE
- + " text not null, " + BODY + " text not null " + ");";
- Log.i("haiyang:createDB=", sql);
- //执行这条SQL语句
- db.execSQL(sql);
- }
- @Override
- public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
- }
- }
代码解释:
DatabaseHelper类继承了SQLiteOpenHelper 类,并且重写了onCreate和onUpgrade方法。
在onCreate()方法里边首先我们构造一条SQL语句,然后调用db.execSQL(sql)执行SQL语句。这条SQL语句为我们生成了一张数据库表。
目前我们还不需要升级数据库,所以我们在onUpgrade()函数里边没有执行任何操作。
4.第四步
我们单击插入两条记录的按钮,如果数据成功插入到数据库当中的diary表中,那么在界面的title区域就会有成功的提示,如图8-8所示。
(点击查看大图)图8-8 成功插入两条数据 |
单击这个按钮后,程序执行了监听器里的onClick方法,并最终执行了上述程序里的insertItem方法,其具体代码如下所示:
- private void insertItem() {
- SQLiteDatabase db = mOpenHelper.getWritableDatabase();
- //首先生成SQL语句
- String sql1 = "insert into " + TABLE_NAME + " (" + TITLE + ", " + BODY
- + ") values('haiyang', 'Android的发展真是迅速啊');";
- String sql2 = "insert into " + TABLE_NAME + " (" + TITLE + ", " + BODY
- + ") values('icesky', 'Android的发展真是迅速啊');";
- try {
- Log.i("haiyang:sql1=", sql1);
- Log.i("haiyang:sql2=", sql2);
- db.execSQL(sql1);
- db.execSQL(sql2);
- setTitle("插入两条数据成功");
- } catch (SQLException e) {
- setTitle("插入两条数据失败");
- }
- }
代码解释:
SQLiteDatabase db = mOpenHelper.getWritableDatabase()这条语句负责得到一个可写的SQLite数据库,如果这个数据库还没有建立,那么mOpenHelper辅助类负责建立这个数据库。如果数据库已经建立,那么直接返回一个可写的数据库。
sql1和sql2是我们构造的标准的插入SQL语句,如果对SQL语句不是很熟悉,可以参考相关的书籍。鉴于本书的重点是在Android方面,所以对SQL语句的构建不进行详细的介绍。
Log.i()会将参数内容打印到日志当中,并且打印级别是Info级别,在使用LogCat工具的时候我们会进行详细的介绍。
db.execSQL(sql1)语句对SQL语句进行执行。
小知识 对Android的打印级别介绍
Android支持5种打印级别,分别是Verbose、Debug、Info、Warning、Error,当然我们在程序当中一般用到的是Info级别,即将一些自己需要知道的信息打印出来,如图8-9所示。
(点击查看大图)图8-9 Android中的5种打印级别 |
5.第五步
单击查询数据库的按钮,会在界面的title区域显示当前数据表当中数据的条数,刚才我们插入了两条,那么现在单击后应该显示为两条,如图8-10所示。
(点击查看大图)图8-10 显示两条数据 |
单击这个按钮后,程序执行了监听器里的onClick方法,并最终执行了上述程序里的showItems方法,具体代码如下所示:
- private void showItems() {
- SQLiteDatabase db = mOpenHelper.getReadableDatabase();
- String col[] = { TITLE, BODY };
- //进行数据库查询
- Cursor cur = db.query (TABLE_NAME, col, null, null, null, null, null);
- Integer num = cur.getCount();
- setTitle(Integer.toString(num) + " 条记录");
- }
代码解释:
SQLiteDatabase db = mOpenHelper.getReadableDatabase()语句首先得到一个可写的数据库。
Cursor cur = db.query(TABLE_NAME, col, null, null, null, null, null)语句将查询到的数据放到一个Cursor 当中。这个Cursor里边封装了这个数据表TABLE_NAME当中的所有条列。 query()方法相当的有用,在这里我们简单地讲一下。
第一个参数是数据库里边表的名字,比如在我们这个例子,表的名字就是TABLE_NAME,也就是"diary"。
第二个字段是我们想要返回数据包含的列的信息。在这个例子当中我们想要得到的列有title、body。我们把这两个列的名字放到字符串数组里边来。
第三个参数为selection,相当于SQL语句的where部分,如果想返回所有的数据,那么就直接置为null。
第四个参数为selectionArgs。在selection部分,你有可能用到"?",那么在selectionArgs定义的字符串会代替selection中的"?"。
第五个参数为groupBy。定义查询出来的数据是否分组,如果为null则说明不用分组。
第六个参数为having ,相当于SQL语句当中的having部分。
第七个参数为orderBy,来描述我们期望的返回值是否需要排序,如果设置为null则说明不需要排序。
Integer num = cur.getCount()语句通过getCount()方法,可以得到Cursor当中数据的个数。
小知识 什么是Cursor ?
Cursor 在Android当中是一个非常有用的接口,通过Cursor 我们可以对从数据库查询出来的结果集进行随机的读写访问。
6.第六步
单击删除一条数据库的按钮后,如果成功删除,我们可以看到在屏幕的标题(title)区域有文字提示,如图8-11所示。
现在我们再单击查询数据库按钮,看数据库里边的记录是不是少了一条。单击查询数据库按钮后,出现如图8-12所示的界面。
(点击查看大图)图8-11 成功删除一条记录 |
(点击查看大图)图8-12 还剩一条记录 |
下面我们来看一下如何删除数据。
单击删除一条记录的按钮后,程序执行了监听器里的onClick方法,并最终执行了上述程序里的deleteItem方法,其代码如下所示:
- private void deleteItem() {
- try {
- SQLiteDatabase db = mOpenHelper.getWritableDatabase();
- //进行删除操作
- db.delete(TABLE_NAME, " title = 'haiyang'", null);
- setTitle("删除title为haiyang的一条记录");
- } catch (SQLException e) {
- }
- }
代码解释:
db.delete(TABLE_NAME, " title = 'haiyang'", null)语句删除了一条title='haiyang'的数据。当然如果有很多条数据title都为'haiyang',那么一并删除。我们对delete方法的参数进行以下介绍。
第一个参数是数据库表名,在这里是TABLE_NAME,也就是diary。
第二个参数,相当于SQL语句当中的where部分,也就是描述了删除的条件。
如果在第二个参数当中有"?"符号,那么第三个参数中的字符串会依次替换在第二个参数当中出现的"?"符号。
7.第七步
单击删除数据表,我们可以删除diary这张数据表,如图8-13所示。
(点击查看大图)图8-13 删除数据库表 |
下边我们看在代码部分,是怎么实现删除的,具体代码如下所示:
- private void dropTable() {
- SQLiteDatabase db = mOpenHelper.getWritableDatabase();
- String sql = "drop table " + TABLE_NAME;
- try {
- //执行SQL语句
- db.execSQL(sql);
- setTitle("数据表成功删除:" + sql);
- } catch (SQLException e) {
- setTitle("数据表删除错误");
- }
- }
代码解释:
首先我们构造了一个标准的删除数据表的SQL语句,然后执行这条语句db.execSQL(sql)。
8.第八步
现在单击其他的按钮,程序运行时有可能会出现异常,我们单击重新建立数据表按钮,如图8-14所示。
现在我们单击查询数据库,看里边是否有数据,如图8-15所示。
下边我们看一下程序是如何建立一张新表的,具体实现代码如下所示:
- private void CreateTable() {
- SQLiteDatabase db = mOpenHelper.getWritableDatabase();
- String sql = "CREATE TABLE " + TABLE_NAME + " (" + TITLE
- + " text not null, " + BODY + " text not null " + ");";
(点击查看大图)图8-14 重新建立数据库表 |
(点击查看大图)图8-15 新建的表里边没有数据 |
- Log.i("haiyang:createDB=", sql);
- try {
- db.execSQL("DROP TABLE IF EXISTS diary");
- db.execSQL(sql);
- setTitle("数据表成功重建");
- } catch (SQLException e) {
- setTitle("数据表重建错误");
- }
- }
代码解释:
sql变量表示的语句为标准的SQL语句,负责按要求建立一张新表。
db.execSQL("DROP TABLE IF EXISTS diary")语句表示,如果存在diary这张表,我们需要先删除,因为在同一个数据库当中不能出现两张同样名字的表。
db.execSQL(sql)语句执行SQL语句,新表建立。
发表评论
-
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 ...
相关推荐
本文将深入探讨三种主要的数据存储方式:SharedPreferences、File和SQLite数据库,以及它们在实际的Activity中的应用。 首先,我们来看SharedPreferences。SharedPreferences提供了一个轻量级的机制来存储键值对...
总的来说,"Android源码——数据库SQLite.zip"的内容涵盖了SQLite在Android中的使用、数据库的创建与管理、SQL操作、事务处理、性能优化等方面的知识,对于深入理解Android应用的数据存储机制具有很高的学习价值。
在Android应用开发中,SQLite是一个重要的组成部分,它是一款轻量级的数据库系统,用于存储、管理应用程序中的结构化数据。本教程聚焦于Android中SQLite编程的一个关键操作——数据的插入,这对于任何涉及到本地数据...
6. **数据存储**:查看SQLite数据库的使用,或者SharedPreferences、Room数据库框架等其他存储方式。 7. **网络通信**:可能涉及到网络请求库,如Retrofit或OkHttp,以及如何处理JSON数据。 8. **异步编程**:理解...
5. **数据持久化**:步数数据需要保存以便后续查看,这可能使用SharedPreferences进行轻量级存储,或者ContentProvider、SQLite数据库进行更复杂的数据管理。 6. **权限管理**:使用传感器需要申请相应的权限,如...
4. **数据存储**:Android提供SQLite数据库和SharedPreferences等本地存储方式,源码可能使用这些技术来保存用户信息、设置或缓存数据。此外,现代应用也倾向于使用Room库,它提供了更友好的API进行数据库操作。 5....
5. **数据存储**:可能使用SQLite数据库进行本地数据存储,或者使用Room库,它是Android官方推荐的数据库访问层解决方案,提供更友好的API。 6. **网络请求**:可能会使用OkHttp或Volley进行网络请求,获取和发送...
- **SQLite数据库**:了解如何使用SQLite存储和检索本地数据。 - **网络通信**:学习如何使用HttpURLConnection、OkHttp或Retrofit等库进行网络请求。 - **JSON解析**:理解如何解析和序列化JSON数据,如使用Gson或...
2. **SQLite数据库**:在Android中,SQLite是最常用的本地数据存储方式。query-master可能包含了对SQLite数据库的操作,包括创建数据库、表结构设计、数据插入、查询、更新和删除等。通过源码,我们可以学习到如何...
Android提供了SQLite数据库、SharedPreferences或最近的Room库进行数据存储。源码中会涉及数据操作的相关类,例如ContentProvider和SQLiteOpenHelper。 6. **权限管理** 由于Android系统的权限模型,播放器可能...
6. **数据存储**:可能涉及到SQLite数据库操作,或者使用SharedPreferences存储轻量级数据。 7. **用户界面**:`XML`布局文件展示了应用的视图结构,可能使用了RecyclerView、ViewPager等组件进行动态展示。 8. **...
本压缩包文件"安卓Android源码——安卓Android学习——数据存储.rar"显然是针对安卓数据存储机制的学习资料,其中可能包含了相关的源代码示例和讲解。下面我们将深入探讨安卓中的数据存储方法。 1. **Shared ...
Android提供了SQLite数据库和SharedPreferences等方式进行本地数据存储,同时使用HTTP或HTTPS协议进行网络通信。源码中可能包含对这两种技术的使用,开发者可以从中学习如何在Android应用中实现数据的获取、存储和...
Android提供了SQLite数据库、SharedPreferences、File存储等多种方式。OpenSudoku-android可能选择了SQLite,创建自定义表结构存储游戏数据,并通过ContentProvider进行数据读写。 六、资源管理 项目的资源文件如...
在Android应用开发中,数据存储是至关重要的一个环节,它涉及到用户信息的持久化,使得应用在退出或设备重启后仍能保持之前的状态。在众多的数据存储方式中,SharedPreferences是一种轻量级的选择,尤其适用于存储小...