Android学习笔记(六)SQLite

标签: android 学习 笔记 | 发表时间:2011-12-28 21:20 | 作者:Libo@Deng
出处:http://www.cnblogs.com/

一、废话

今天感冒了!... ...(以下省略500字)

二、正文

1、  SQLite是个啥?

SQLite是一个极轻量型的数据库。它在提供了和大型数据库相当的功能,还具有轻便、跨平台等优点,SQLite使用非常方便,并不需要我们像常规数据库(SQLServer,Mysql等)那样进行安装,在Android的JDK中,其实是已经包含了SQLite这个数据库的核心。当然我们必须要强调一点,SQLite并不是只针对Android的,其实它还可以用在别的很多地方。

2、  在Android系统中如何使用SQLite数据库?

要在Android系统中使用SQLite数据库,其实是一件非常轻松的事情,只要继承来自android.database.sqlite包中的SQLiteOpenHelper类,并重写其中的几个重要方法后,你就可以对数据库进行相关的操作了。

 1 public class MyDatabaseHelper extends SQLiteOpenHelper {   
2
3 private static final String DB_NAME = "test_db"; //数据库名称
4 private static final int VERSION = 1; //数据库版本
5
6 public MyDatabaseHelper(Context context) {
7 super(context, DB_NAME, null, VERSION);
8 // TODO Auto-generated constructor stub
9 }
10
11 @Override
12 public void onCreate(SQLiteDatabase db) {
13 String sql = "create table user(username varchar(25) not null , password varchar(60) not null );";
14 db.execSQL(sql);
15 }
16
17 @Override
18 public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
19 // TODO Auto-generated method stub
20
21 }
22
23 }

还是先来看看SQLiteOpenHelper这个类吧。“A helper class to manage database creation and version management.”官方的一个帮助文档这样描述这个类,也就是说,这个类主要的作用是用来创建数据库和对数据库进行版本更新的。

这个类中必须重写的两个方法分别为:onCreate(SQLiteDatabase db)和onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)。

  • onCreate(SQLiteDatabase db):用于创建数据库db中的表,而不是创建db数据库实例。这个方法并不需要我们自己去调用,当数据库第一次被创建时,这个方法会自动被调用。那么数据库真正的创建是在什么时候呢?当我们调用getReadableDatabase()/getWritableDatabase()方法时,数据库会被真实的创建。
  • onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion):这个方法用来对数据库进行更新操作,你可以在这个方法中定义你自己的一些操作。这个方法也不需要我们主动去调用,当SQLiteOpenHelper类的最后一个参数比原值大的时候,这个方法会自动被调用。调用的时刻同onCreate()方法。

另外在SQLiteOpenHelper类中,还有两个方法也非常重要:getReadableDatabase(),getWritableDatabase()。

  • getReadableDatabase():返回一个只读的数据库实例,在访问数据库中数据但同时又不需要对其进行数据修改时(select操作)可以使用这个方法。
  • getWritableDatabase():返回一个可读写的数据库实例,当需要对数据库进行数据修改时,应该调用这个方法。记住在使用完成后,一定是要使用close()方法来释放内存,否则会造成内存泄露。

3、  在Android系统中如何对SQLite数据库进行常规操作?

  • (Cursor) query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit)——查询操作,返回一个游标
    • table——表名;
    • columns——列名集合
    • selection——在where语句中的表达式,如id=?
    • selectionArgs——在where表达式中传入的参数,也就是上面“?”所占据的值
    • groupBy\having\orderby\limit——这些参数如果各位不清楚,请google下SQL语句基础
       1public Cursor Query(String table, String[] filed, long rowId)       
      2throws SQLException {
      3
      4 Cursor mCursor = _db.query(true, table, filed, "ID=?" + rowId, null,null, null, null, null);
      5if (mCursor != null) {
      6 mCursor.moveToFirst();
      7 }
      8return mCursor;
      9 }
      10
      11public Cursor Query(String table) {
      12 Cursor mCursor = _db.query(true, table, new String[] { "*" }, null,null, null, null, null, null);
      13if (mCursor != null) {
      14 mCursor.moveToFirst();
      15 }
      16return mCursor;
      17 }
  • (int) update(String table, ContentValues values, String whereClause, String[] whereArgs)——进行更新操作
    • table——表名
    • values——ContentValues类型,其实就是键值对,键代表需要修改的列名,值代表对应的新值
    • whereClause——where语句中的表达式,可以直接组成一个完整的表达式如:id=1,此时whereArgs传入null,如果id=?,那么whereArgs和query(...)的selectionArgs一样。
    • whereArgs——在where表达式中传入的参数
       1 public boolean Update(String table, String[] fieldName,       
      2 String[] fieldValue, long rowID) throws SQLException {
      3 ContentValues cv = new ContentValues();
      4 for (int i = 0; i < fieldName.length; i++) {
      5 cv.put(fieldName[i], fieldValue[i]);
      6 }
      7 if (_db.update(table, cv, "ID=" + rowID, null) > 0) {
      8 return true;
      9 }
      10 return false;
      11 }
  • (long) insert(String table,String nullColumnHack,ContentValues values)——进行插入操作
    • table——表名
    • nullcolumnHack——当插入空值的时候有用
    • values——键值对,键代表需要修改的列名,值代表对应的新值
       1 public boolean Insert(String table, String[] fieldName, String[] fieldValue) throws SQLException {       
      2 ContentValues cv = new ContentValues();
      3 for (int i = 0; i < fieldName.length; i++) {
      4 cv.put(fieldName[i], fieldValue[i]);
      5 }
      6 if (_db.insert(table, null, cv) > 0) {
      7 return true;
      8 }
      9 return false;
      10 }
  • (int) delete(String table,String whereClause,String[] whereArgs)——进行删除操作
    • table——表名
    • whereClause/whereArgs——同update()方法
      1 public boolean Delete(String table, long rowID) throws SQLException {       
      2 if (_db.delete(table, "ID=?", new String[] { rowID + "" }) > 0)
      3 return true;
      4 return false;
      5 }
  • (void) execSQL(String sql)——执行sql语句
    • 执行非select操作的语句,灵活性强。

在上面的方法中,有看不懂的地方,请看Demo源码。

三、总结

SQLite作为一个轻型数据库,在Android中可以用来存储用户数据,如短信、联系人等信息。在Android中使用SQLite是非常灵活的,所以不一定非要按照某一种特定的方式来操作数据库。下一篇笔记中将说说ContentProvider类。

源码下载

本文链接

相关 [android 学习 笔记] 推荐:

Android学习笔记(六)SQLite

- - 博客园_首页
SQLite是一个极轻量型的数据库. 它在提供了和大型数据库相当的功能,还具有轻便、跨平台等优点,SQLite使用非常方便,并不需要我们像常规数据库(SQLServer,Mysql等)那样进行安装,在Android的JDK中,其实是已经包含了SQLite这个数据库的核心. 当然我们必须要强调一点,SQLite并不是只针对Android的,其实它还可以用在别的很多地方.

Android Native 代码开发学习笔记

- iDesperadO - WindStorm
本文提供排版更佳的PDF版本下载. JNI,全称Java Native Interface,是用于让运行在JVM中的Java代码和运行在JVM外的Native代码(主要是C或者C++)沟通的桥梁. 代码编写者即可以使用JNI从Java的程序中调用Native代码,又可以从Native程序中调用Java代码.

Android学习笔记之Gallery(2)

- - CSDN博客推荐文章
Toast.makeText(GalleryActivity.this, "点击了第"+arg2+"张图片", Toast.LENGTH_LONG).show();. // 给ImageView设置资源. // 设置布局 图片120*80. 创建一个新的XML文件在 res/values/目录下 attrs.xml命名.

Android学习笔记之布局

- - CSDN博客推荐文章
我们对Android应用程序运行原理及布局文件可谓有了比较深刻的认识和理解,并且用“Hello World. 在继续深入 Android开发之旅之前,有必要解决前两篇中没有介绍的遗留问题:View的几种布局显示方法,以后就不会在针对布局方面做过多的介绍. View的布局显示方式有下面几种: 线性布局(Linear Layout)、 相对布局(Relative Layout)、 表格布局(Table Layout)、 网格视图(Grid View)、 标签布局(Tab Layout)、 列表视图(List View)、 绝对布局(AbsoluteLayout).

Google《Android性能优化》学习笔记

- - 外刊IT评论
现在有不少App为了达到很华丽的视觉效果,会需要在界面上层叠很多的视图组件,但是这会很容易引起性能问题. 如何平衡Design与Performance就很需要智慧了. 大多数手机的屏幕刷新频率是60hz,如果在1000/60=16.67ms内没有办法把这一帧的任务执行完毕,就会发生丢帧的现象. 丢帧越多,用户感受到的卡顿情况就越严重.

shell 学习笔记

- tiger - 游戏人生
将脚本目录加到 PATH 中. 在 dash 中如何进行字符串替换. 将 rst 格式文档转换为 blog 可用的 html 代码. shell 脚本虽然不是非常复杂的程序, 但对于首次接触的我来讲, 多少还是有些忌惮. 不过, 接触任何新事物都需要勇敢面对, 逐步树立信心. 我是冲着把脚本写好去的, 所以, 我的目标是能够写出友好, 健壮, 优美的脚本..

OAuth学习笔记

- 宋大妈 - FeedzShare
来自: 标点符 - FeedzShare  . 发布时间:2011年08月29日,  已有 2 人推荐. OAuth(开放授权)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用. OAuth允许用户提供一个令牌,而不是用户名和密码来访问他们存放在特定服务提供者的数据.

Vim学习笔记

- 临池学书 - C++博客-首页原创精华区
最近在学习Vimtutor中的相关内容,Vim的使用博大精深,很多命令一旦不使用就会忘记,下面把其中的没有使用到的相关命令做一个简单的总结,供以后复习使用. 至于常见的保存,插入等等命令,则不予记录,在以后的使用中加深练习即可. To change until the end of a word, type  ce (ce + 修正的单词).

OAuth学习笔记

- jiaosq - 标点符
OAuth(开放授权)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用. OAuth允许用户提供一个令牌,而不是用户名和密码来访问他们存放在特定服务提供者的数据. 每一个令牌授权一个特定的网站(例如,视频编辑网站)在特定的时段(例如,接下来的2小时内)内访问特定的资源(例如仅仅是某一相册中的视频).

HTML学习笔记

- - CSDN博客推荐文章
超文本标记语言( 英文:HyperText Markup Language,HTML)是为“ 网页创建和其它可在 网页浏览器中看到的信息”设计的一种 标记语言. HTML被用来结构化信息——例如标题、段落和列表等等  点击打开链接. w3schools  点击打开链接 {语法大全,超赞.