Android學習筆記(六)SQLite


一、廢話

   今天感冒了!... ...(以下省略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類。

源碼下載


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM