Android学习笔记(六)SQLite

来源:互联网 发布:js的原型 编辑:程序博客网 时间:2024/05/16 05:53

一、废话

   今天感冒了!... ...(以下省略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     @Override12     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     @Override18     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {19         // TODO Auto-generated method stub20  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     }1011public 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类。

原创粉丝点击