SQlite簡介
SQLite是一般常用在嵌入式系統的資料庫,特色為支援精簡「SQL」指令、效能好、相對其它資料庫使用更少的記憶體,因為所有資料都儲存在一個檔案當中,所以在移轉資料時也非常便利。
在使用SQLite時,大部份為以下四個動作:- 新增記錄(Insert)。
- 查詢紀錄(Query)。
- 更改紀錄(Update)。
- 刪除記錄(Delete)。
在Android下使用SQLite資料庫的方式根據是否要共享資料庫來設計存取的方式:
- 不打算共享時,可以透過SQLite的API直接存取資料庫。
- 要與其它應用程式共享資料時則必須透過內容提供者(Content Provider)來存取資料庫。
透過SQLiteOpenHelper
操作資料庫
Android應用程式可以透過繼承SQLiteOpenHelper
類別來建立自己的應用程式當中操作資料庫的類別。
- 在專案名稱上點擊滑鼠右鍵->New->Java Class。
- 在建立的新類別並繼承自
SQLiteOpenHelper
類別。 如:private class MyDBHelper extends SQLiteOpenHelper { }
當輸入完上面程式碼後,在SQLiteOpenHelper下會出現紅色波浪的錯誤,表示未導入(import)該類別庫,可以將滑鼠移到該紅線下然後選取
import SQLiteOpenHelper
。
在完成上面步驟後,會發現 -
這時,會發現錯誤還沒消失,這是因為「SQLiteOpenHelper」還需要加入兩個方法,再次移到紅色波浪線上選取「Add upimplemented methods」,程式碼會變成:
private class MyDBHelper extends SQLiteOpenHelper { public MyDBHelper(Context context, String name, CursorFactory factory, int version) { super(context, name, factory, version); // TODO Auto-generated constructor stub } @Override public void onCreate(SQLiteDatabase db) { // TODO Auto-generated constructor stub } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // TODO Auto-generated constructor stub } }
onCreate()
和onUpgrade()
這兩個方法用來處理建立資料表和變新資料表的動作,而這裡個方法被呼叫的時機為:onCreate()
:當應用程式第一次執行時,如果資料庫不存在,則SQLiteOpenHelper
會自動建立資料庫並呼叫onCreate()
方法。onUpgrade()
:當應用程式中建立繼承自SQLiteOpenHelper類別時,建構式第四個參數的版本如果變更了,該方法就會被呼叫。
- 在
onCreate()
方法內建立資料表:// 當資料庫不存在的時候, Android系統自動建立資料庫時, 這個方法會被觸發 @Override public void onCreate(SQLiteDatabase db) { // 建立要存放資料的資料表格(相當於Excel的sheet) // 1. SQL語法不分大小寫 // 2. 這裡大寫代表的是SQL標準語法, 小寫字是資料表/欄位的命名 db.execSQL("CREATE TABLE mytable(_id INTEGER PRIMARY KEY AUTOINCREMENT," + "name TEXT NOT NULL," + "content TEXT," + "number INTEGER)"); }
當系統自動幫我們建立資料庫後會呼叫
onCreate()
方法,並傳入一個SQLiteDatabase
物件,透過呼叫該物件的execSQL()
方法,我們可以傳入一串SQL語法,用該語法來建立資料表(table)CREATE TABLE 為SQL語法,代表要建立資料表。 mytable 我們要建立的資料表名稱。 _id, name, content, number 我們要建立的欄位名稱,這裏總共會建立四個欄位來存放一筆資料。 INTEGER, TEXT, REAL 每個欄位要存放的資料類型,INTEGER代表該欄位存放的是數字,TEXT代表是字串,REAL代表小數數字。 PRIMARY KEY AUTOINCREMENT SQLite資料庫每一筆資料都要有的主鍵,裡面的資料是唯一的。 NOT NULL 該欄位的資料不可以為空,如果新增一筆資料時,沒有指定該欄位值,將會發生錯誤。 -
當應用程式因為改版而修改了資料庫內的表格結構時,因為
一般步驟為:onCreate()
只有在第一次建立資料庫時會被呼叫一次而已,如果想要修改資料表,我們可以透過在建立SQLiteOpenHelper物件時,可以增加版本號碼,這樣onUpgrade()
方法就會被呼叫,然後我們可以在onUpgrade()
做資料表更改的動作。- 修改
onCreate()
建立新的資料表。 - 在
onUpgrade()
呼叫onCreate()
建立新版的資料表。 - 將資料從就的資料表讀到新的資料表。
- 刪除舊的資料表。例:
db.execSQL("DROP TABLE IF EXISTS mytable");
在
onUpgrader()
方法內,我們會多收到兩個參數,oldVersion為目前的資料庫版本,newVersion為新的版本,我們也可以根據自己定義的版本號碼來決定要怎麼修改資料庫。
根據Android官方文件,
原文網址onCreate
和onUpgrade
方法會在第一次呼叫。注意
在onCreate
和onUpgrade
方法內,你只能使用透過該方法傳進來的SQLiteDatabase物件來進行資料庫操作,且不需要去關閉(close()
)它。 - 修改
MyDBHelper
下出現紅色波浪,這是因為SQLiteOpenHelper
需要特定參數的建構式,將滑鼠移動到該紅線上,選取「Add constructor MyDBHelper(Context, String, CursorFactory, int)」後,Eclipse就會自動幫我們加入該建構式的程式碼:
private class MyDBHelper extends SQLiteOpenHelper { public MyDBHelper(Context context, String name, CursorFactory factory, int version) { super(context, name, factory, version); // TODO Auto-generated constructor stub } }建構式參數說明:
context | 可以操作資料庫的內容本文,一般可直接傳入Activity 物件。 |
name | 要操作資料庫名稱,如果資料庫不存在,會自動被建立出來並呼叫onCreate() 方法。 |
factory | 用來做深入查詢用,入門時用不到。 |
version | 版本號碼。 |