设为首页 收藏本站
查看: 1820|回复: 0

[经验分享] android 数据储存——--SQLite存储方式(3)

[复制链接]

尚未签到

发表于 2016-11-30 10:53:57 | 显示全部楼层 |阅读模式
  在前边的章节当中主要学习关于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语句,对数据库进行增、删、查、改的操作。需要注意的是,数据库对于一个应用来说是私有的,并且在一个应用当中,数据库的名字也是惟一的。


DSC0000.jpg  
(点击查看大图)图8-6  程序目录结构图


DSC0001.jpg  
(点击查看大图)图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所示。
  



DSC0002.jpg  
(点击查看大图)图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所示。
  



DSC0003.jpg  
(点击查看大图)图8-9  Android中的5种打印级别

注意 虽然执行SQL语句在Android当中并没有强制放在try catch 语句当中,但是我们最好这么做。并在catch模块中将错误信息打印在日志当中。这样一方面是方便调试,另一方面可以加强程序的健壮性。  5.第五步
  单击查询数据库的按钮,会在界面的title区域显示当前数据表当中数据的条数,刚才我们插入了两条,那么现在单击后应该显示为两条,如图8-10所示。
  



DSC0004.jpg  
(点击查看大图)图8-10  显示两条数据
  单击这个按钮后,程序执行了监听器里的onClick方法,并最终执行了上述程序里的showItems方法,具体代码如下所示:


  • private void showItems() {  
  •  
  • SQLiteDatabase db = mOpenHelper.getReadableDatabase();  
  • String col[] = { TITLE, BODY };  

  • //进行数据库查询  

  • Cursor cur = db.query (TABLE_NAME, col,
    nullnullnullnullnull);  
  • 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所示的界面。
  



DSC0005.jpg  
(点击查看大图)图8-11  成功删除一条记录


DSC0006.jpg  
(点击查看大图)图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所示。
  



DSC0007.jpg  
(点击查看大图)图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 " + ");"

  



DSC0008.jpg  
(点击查看大图)图8-14  重新建立数据库表


DSC0009.jpg  
(点击查看大图)图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语句,新表建立。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-307645-1-1.html 上篇帖子: Ubuntu12.04下安装 sqlite以及其使用 下篇帖子: android sqlite的增删改查(转)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表