Android資料存放區(五) SQLite資料庫在Android中的API

來源:互聯網
上載者:User

上次我向大家介紹了SQLite的基本資料和使用過程,相信朋友們對SQLite已經有所瞭解了,那今天呢,我就和大家分享一下在Android中如何使用SQLite。

現在的主流行動裝置像Android、iPhone等都使用SQLite作為複雜資料的儲存引擎,在我們為行動裝置開發應用程式時,也許就要使用到SQLite來儲存我們大量的資料,所以我們就需要掌握行動裝置上的SQLite開發技巧。對於Android平台來說,系統內建了豐富的API來供開發人員操作SQLite,我們可以輕鬆的完成對資料的存取。

一 、SQLiteOpenHelper

可以直接使用SQLiteDataBase直接去建立資料庫,但是Android提供了一種更加安全優雅的方式去操作資料庫,那就是SQLiteOpenHelper。SQLiteOpenHelper是用來管理資料庫的一個工具類,可以用於管理資料庫的建立和版本更新。

SQLiteOpenHelper是一個抽象類別,所以要建立它的子類,重寫它的方法來使用它建立和管理資料庫。

子類繼承SQLiteOpenHelper的方法,必須重寫下面兩個方法:

public abstract void onCreate(SQliteDatabase db);

public abstract void onUpdate(SQLiteDatabase db,int oldVersion,int newVersion);

     SQLiteOpenHelper會自動檢測資料庫檔案是否存在。如果存在,會開啟這個資料庫,在這種情況下就不會調用onCreate()方法。如果資料庫檔案不存在,SQLiteOpenHelper首先會建立一個資料庫檔案,然後開啟這個資料庫,最後調用onCreate()方法。因此,onCreate()方法一般用來在新建立的資料庫中建立表、視圖等資料庫組建。也就是說oncreate()方法在資料庫檔案第一次建立時調用。
    先看看SQLiteOpenHelper類的構造方法再解釋onUpdate()方法何時會被調用。
    public SQLiteOpenHelper(Context context,String name,CursorFactory factory,int version);
    其中name參數表示資料庫檔案名(不包括檔案路徑),SQLiteOpenHelper會根據這個檔案名稱建立資料庫檔案。version表示資料庫的版本號碼。如果當前傳入的資料庫版本號碼比上次建立或升級的版本號碼高,SQLiteOpenHelper就會調用onUpdate()方法。也就是說,當資料庫第一次建立時會有一個初始的版本號碼。當需要對資料庫中的表、視圖等組建升級時可以增大版本號碼,再重新建立它們。現在總結一下oncreate()和onUpdate()調用過程。
    1.如果資料庫檔案不存在,SQLiteOpenHelper在自動建立資料庫後會調用oncreate()方法,在該方法中一般需要建立表、視圖等組件。在建立前資料庫一般是空的,因此不需要先刪除資料庫中相關的組件。
    2.如果資料庫檔案存在,並且目前的版本號高於上次建立或升級的版本號碼,SQLiteOpenHelper會調用onUpdate()方法,調用該方法後會更新資料庫的版本號碼。在onupdate()方法中除了建立表、視圖等組件外,還需要先刪除這些相關的組件,因此,在調用onupdate()方法前,資料庫是存在的,裡面還原許多資料庫組建。

     綜合上述兩點,可以得出一個結論。如果資料庫檔案不存在,只有oncreate()被調用(該方法在建立資料庫時被調用一次)。如果資料庫檔案存在,會調用onupdate()方法升級資料庫,並更新版本號碼。

除了必須重寫這兩個方法外,還必須要一個構造方法:

SQLiteOpenHelper提供了兩個構造方法:

1、public SQLiteOpenHelper(Context context,String name,
SQLiteDatabase.CursorFactory factory, int version)

建立一個helper對象,用於管理資料庫。

參數:

context    :  Context對象,用於去開啟或建立一個資料庫

name      :  資料庫名稱

factory     : 遊標工廠,用於建立一個遊標對象,如果使用null,則使用預設的遊標

version   : 資料庫版本號碼,從1開始。如過版本號碼提升了,那麼就去調用onUpgrade(SQLiteDatabase, int, int)方法。如過版本號碼降低了,那麼就去調用onDowngrade(SQLiteDatabase, int, int)方法。

2、public SQLiteOpenHelper(Context context,String name,
SQLiteDatabase.CursorFactory factory, int version,DatabaseErrorHandler errorHandler)

建立一個helper對象,用於管理資料庫。

參數:

context    :  Context對象,用於去開啟或建立一個資料庫

name      :  資料庫名稱

factory     : 遊標工廠,用於建立一個遊標對象,如果使用null,則使用預設的遊標

version   : 資料庫版本號碼,從1開始。如過版本號碼提升了,那麼就去調用onUpgrade(SQLiteDatabase, int, int)方法。如過版本號碼降低了,那麼就去調用onDowngrade(SQLiteDatabase, int, int)方法。

errorHandler :用於報告資料庫


SQLiteOpenHelper類當然還有其他的方法,不過一般不需要我們去重寫。

public synchronized void close()       :關閉任何已經開啟的資料庫。

public String getDatabaseName()    :返回開啟的資料庫的名稱,就是構造器指定的那個資料庫。

public synchronized SQLiteDatabase  getReadableDatabase() :開啟或者建立一個唯讀資料庫

public synchronized SQLiteDatabase  getWriteableDatabase() :開啟或者建立一個可讀寫的資料庫

public void onDowngrade(SQLiteDadabase db,int oldVersion,int newVersion) :資料庫版本號碼降低時調用

public void onOpen(SQLiteDatabase db) :資料庫開啟時調用

如何使用SQLiteOpenHelper的子類,去建立和管理資料庫:

1、使用構造方法new一個helper對象

2、使用helper對象,調用getReadableDatabase()或getWriteableDatabase()方法返回一個SQLiteDatabase對象

3、使用SQLiteDatabase對象進行資料庫操作。

舉個簡單的例子:

public class DBHelper extends SQLiteOpenHelper {        private static final String DATABASE_NAME = "test.db";      private static final int DATABASE_VERSION = 1;            public DBHelper(Context context) {          //CursorFactory設定為null,使用預設值          super(context, DATABASE_NAME, null, DATABASE_VERSION);      }        //資料庫第一次被建立時onCreate會被調用      @Override      public void onCreate(SQLiteDatabase db) {          db.execSQL("CREATE TABLE IF NOT EXISTS person" +                  "(_id INTEGER PRIMARY KEY AUTOINCREMENT, name VARCHAR, age INTEGER, info TEXT)");      }        //如果DATABASE_VERSION值被改為2,系統發現現有資料庫版本不同,即會調用onUpgrade      @Override      public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {          db.execSQL("ALTER TABLE person ADD COLUMN other STRING");      }  }  

二 、SQLiteDatabase

SQLiteDatabase對象,代表的就是一個資料庫(底層就是一個資料庫檔案)。我們可以調用SQLiteDatabase累的幾個靜態方法,來獲得一個資料庫物件。當然,更好的方法是上面介紹的,使用SQLiteOpenHelper的子類來獲得一個SQLiteDatabase對象。

當然,不管以什麼方式獲得了SQLiteDatabase對象之後,我們就可以進行資料庫的操作。大部分操作都類似於jdbc中的操作,很容易理解。

資料庫的操作無非CURD,對於  增  刪  改這三種情況,我們可以直接使用

public void execSQL
(String sql)

public void execSQL
(String sql, Object[] bindArgs)

這兩種方法,直接執行標準的SQL語句,也可以用特定的方法來實現,不過對於熟悉SQL語言的人來說,還是使用前一種方法比較直接。

至於查詢情況,就要複雜一點,我們也可以直接使用

public Cursor rawQuery(String sql,String[] selectionArgs)

方法,直接執行標準的SQL查詢語句。當然,和增刪改一樣,也可以用特定的方法來實現。

不對用什麼方法進行查詢,都會將結果集作為一個Cursor遊標對象返回。Cursor對象類是以jdbc中的ResultSet對象。

下面是Cursor對象的常用方法:

    //假設c是一個返回的Cursor對象    c.move(int offset); //以當前位置為參考,移動到指定行      c.moveToFirst();    //移動到第一行      c.moveToLast();     //移動到最後一行      c.moveToPosition(int position); //移動到指定行      c.moveToPrevious(); //移動到前一行      c.moveToNext();     //移動到下一行      c.isFirst();        //是否指向第一條      c.isLast();     //是否指向最後一條      c.isBeforeFirst();  //是否指向第一條之前      c.isAfterLast();    //是否指向最後一條之後      c.isNull(int columnIndex);  //指定列是否為空白(列基數為0)      c.isClosed();       //遊標是否已關閉      c.getCount();       //總資料項目數      c.getPosition();    //返回當前遊標所指向的行數      c.getColumnIndex(String columnName);//返回某列名對應的列索引值      c.getString(int columnIndex);   //返回當前行指定列的值  string類型      c.getInt(int columnIndex);   //返回當前行指定列的值  int類型    c.getFloat(int columnIndex);   //返回當前行指定列的值  float類型

關於更多的Cursor資訊,可以參考官方文檔中的說明。要想熟練的使用,還是得多多練習。

三、事務的概念

SQLite資料庫也使用了事務的處理方法,SQLiteDatabase類也提供了交易處理的API。

使用beginTransaction()方法開啟一個事務,然後執行資料庫操作,然後調用setTransactionSuccessful()方法設定事務成功標誌。使用endTransaction結束提交事務。

還可以使用inTransaction()方法判斷是否處於一個事務中。

下面幾個例子說明:

public void payment()  {     SQLiteDatabase db = dbOpenHelper.getWritableDatabase();     //開啟事務     db.beginTransaction();     try     {     //執行資料庫操作       db.execSQL("update person set amount=amount-10 where personid=?", new Object[]{1});         db.execSQL("update person set amount=amount+10 where personid=?", new Object[]{2});         //設定事務標誌為成功,當結束事務時就會提交事務         db.setTransactionSuccessful();     }     catch(Exception e){       throw(e);   }   finally     {         //結束事務         db.endTransaction();     }  } 

最後:關於SQLiteDatabase的使用流程基本介紹完了,下面在介紹SQLite中資料庫的操作和資料集返回如何處理。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.