[Android 學習筆記] SQL 與 SQLite 資料庫教學 II

開發 Android 應用程式需要透過 SQLiteOpenHelper 和 SQLiteDatabase 類別來建立和存取資料庫的紀錄資料,屬於 android.database.sqlite 套件。


一、使用 SQLiteOpenHelper 類別建立資料庫
SQLiteOpenHelper 類別是一個幫助我們存取 SQLite 資料庫的 Helper Class,我們需要繼承此類別,透過繼承類別來建立 SQLite 資料表和版本管理,建立的資料庫是一個 SQLiteDatabase 類別的物件。

基本上,SQLiteOpenHelper 類別已經實作存取 SQLite 資料庫的相關方法,我們可以透過這些方法來新增、刪除、修改資料。

繼承 SQLiteOpenHelper 類別
Android 應用程式繼承 SQLiteOpenHelper 類別來覆寫相關方法,其主要目的是讓我們可以在 SQLite 資料庫新增資料表(因為資料庫建立已在父類別實作)

現在我們建立一個叫 MyDBHelper (可以自行命名)的子類別繼承自 SQLiteHelper ,並建立建構子和覆寫 onCreate() 及 onUpgrade() 方法,其格式如下:
public class MyDBHelper extends SQLiteOpenHelper {
    private static final String DATABASE_NAME = "todo";
    private static final int DATABASE_VERSION = 1;
    private static final String DATABASE_TABLE = "todos";
    public MyDBHelper(Context context) {
        //透過建構子MyDBHelper直接呼叫父類別建構子來建立參數的資料庫
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }
}

參數說明如下:
1. 參數1為Context物件。
2. 參數2為資料庫名稱(資料庫檔案名稱),其儲存在『\data\data\<套件名稱>\資料庫\』目錄。
3. 參數3為建立Cursor物件,預設null。
4. 參數4為版本整數值,從1開始。

建立建構子後我們仍需要覆寫onCreate()和onUpgrade()方法,例如:
//參數為 SQLiteDatabase 資料庫物件 db,並呼叫execSQL方法建立資料表
@Override
public void onCreate(SQLiteDatabase db) {
    db.execSQL("CREATE TABLE users (" +
    "_id INTEGER PRIMARY KEY AUTOINCREMENT" +
    "name TEXT NO NULL" +
    "age REAL NO NULL)");
}
// 當資料庫是較舊版時呼叫execSQL刪除資料表,並呼叫onCreate重新建立資料庫
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    db.execSQL("DROP TABLE IF EXISTS users");
    onCreate(db);
}

SQLiteOpenHelper 類別的相關方法
1. getReadableDatabase() 建立或開啟(若存在)一個唯獨資料庫,成功則傳回 SQLiteDatabase
2. getWritableDatabase() 建立或開啟(若存在)一個讀寫資料庫,成功開啟傳回 SQLiteDatabase
3. close() 關閉開啟的資料庫


三、使用 SQLiteDatabase 類別存取資料表
開啟可讀寫資料庫
由於需要在資料庫新增、更新和刪除記錄,所以可以開啟可讀寫資料庫,通常是於 onCreate() 方法開啟資料庫,例如:

dbHelper = new MyDBHelper(this);
db = dbHelper.getWritableDatabase();

關閉資料庫
關閉資料庫通常是在 onStop() 方法,呼叫 SQLiteDatabase() 類別的 close() 方法關閉資料庫,例如:

db.close();

新增記錄
SQLiteDatabase 物件可以使用 insert() 方法新增記錄。我們要先透過 Content Values 類別建立欄位值,例如:

long id;
ContentValues cv = new ContentValues();
cv.put("_id", Integer.parseInt(txvId.getText().toString()));
cv.put("name", txvName.getText().toString());
cv.put("age", Double.parseDouble(txvAge.getText().toString()));
id = db.insert(DATABASE_TABLE, null, cv);

更新記錄
SQLiteDatabase 物件是使用 update() 方法更新記錄,使用 Content Values 類別建立更新的欄位值,例如:

//上述update()方法的傳回值是影響的紀錄數,第一個參數是資料表名稱,第二個是ContentValues(),第三個參數WHERE子句的更新條件,條件參數為最後一個參數
int id = Integer.parseInt(txvId.getText().toString());
ContentValues cv = new ContentValues();
cv.put("age", Double.parse(txv.getText().toString()));
count = db.update(DATABASE_TABLE, cv, "_id=" + id, null); 

刪除記錄
SQLiteDatabase 物件可以使用 delete() 方法刪除記錄,例如:

int id = Integer.parseInt(txvId.getText().toString());
count = db.delete(DATABASE_TABLE, "_id=" + id, null);
上述 update() 方法的傳回值是影響的記錄數,第一個參數是資料表名,第二是WHERE子句刪除條件,如果有條件字串(>, <, <>等),條件參數為最後一個參數

查詢記錄
SQLiteDatabase 物件可以使用 rawQuery()方法執行SQL指令來查詢記錄,例如:

Cursor c = db.rawQuery(sql, null);
上述rawQuery()方法第一個參數是SQL查詢指令,如果使用參數SQL指令,就可以在第二個參數指定參數值,方法傳回Cursor物件,為查詢記錄集合,透過查詢指標可以取出值
// 取得Cursor物件後可以透過getColumnNames()方法取值
colNames = c.getColumnNames();
for(int i = 0; i < colNames.length; i++) {
    str += colNames[i] + "\t\t";
}
str += "\n";
我們還可以透過移動指標來查詢每一筆資料
//移動至第一筆
c.moveToFirst();
for(int i = 0; i < c.getCount(); i++) {
    //取出欄位索引值加到字串後
    str += c.getString(0) + "\t\t";
    str += c.getString(1) + "\t\t";
    str += c.getString(2) + "\t\t";
    //移動至下一筆
    c.moveToNext();
}

於 Cursor 物件可以呼叫 getString()、getFloat()、getInt() 取得值。

最後附上一個運用 SQLite 資料庫 CRUD 存取的案例,歡迎有興趣朋友可以參考。Github 範例下載

贊助本站 (Donate)