[Android] SQLiteOpenHelper

第一次自已寫SQLite ….

首先要先知道 有那些欄位 需要的 .
這些欄位請參考你的實際需求~

以下先用自己的sample說明

Implement

這邊使用 SQLiteOpenHelper實作

先新增一個class, extends SQLiteOpenHelper

DatabaseHelper.java
1
public class DatabaseHelper extends SQLiteOpenHelper {}

SQLiteOpenHelper 有兩個 abstract 需要實作, 別擔心 Android studio 會提醒你

DatabaseHelper.java
1
2
3
4
5
6
7
8
9
@Override
public void onCreate(SQLiteDatabase db) {
// onCreate 會在app發現沒有Database檔案時呼叫, 不是每次都會呼叫到
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// Database版本更新時
}

此時,因為 SQLiteOpenHelper 沒有預設的Constraotor
所以你需要

DatabaseHelper.java
1
2
3
4
5
6
7
public ExpenseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
// Context 就是Context
// Name 為Database名稱 預設是"main"
// CursorFactory 其實我不是很熟他在幹嘛 等我認真研究完在補上 先帶null
// Version databse 版本
}

現在你需要 開啟table 參考以下

1
2
3
4
5
6
CREATE TABLE table_name (
column_name1 data_type,
column_name2 data_type,
column_name3 data_type,
···
);

轉換成Android要帶入的

DatabaseHelper.java
1
2
3
4
private String createTable = "CREATE TABLE exp ( _id INTEGER PRIMARY KEY, " +
"cdate DATETIME NOT null, " +
"info VARCHAR, " +
"amount INTEGER)";

table name 取名為 exp
_id 是PRIMARY KEY
cdate, info, amount 皆為欄位
後面的為data type
所以把這組String 帶到剛剛的 onCreate :

DatabaseHelper.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
private String createTable = "CREATE TABLE exp ( _id INTEGER PRIMARY KEY, " +
"cdate DATETIME NOT null, " +
"info VARCHAR, " +
"amount INTEGER)";
@Override
public void onCreate(SQLiteDatabase db) {
// onCreate 會在app發現沒有Database檔案時呼叫, 不是每次都會呼叫到
db.execSQL(createTable);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// Database版本更新時
}

到這邊就可以使用了

MainActivity.java
1
2
3
4
5
6
DatabseHelper helper = new DatabseHelper(this, "main.db", null, 1);
ContentValues values = new ContentValues();
values.put("cdate", _date);
values.put("info", _info);
values.put("amount", _amount);
helper.getWritableDatabase().insert("exp", null, values);

當執行insert時, DatabseHelper 會確認是否有main.db
沒有會先執行 onCreate, 創建出來後 再執行insert

Tool

使用Facebook 開發的stetho > 確認 SharePreference 跟 Database 的內容
參考stackOverflow

使用 stetho
在Module 底下的gradle 加入

build.gradle
1
compile 'com.facebook.stetho:stetho:1.4.2'

在MainAavitity 的 onCreate() 中加入

MainActivity.java
1
2
3
4
5
6
7
8
9
10
11
12
import com.facebook.stetho.Stetho;
.....
......
........
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Stetho.initializeWithDefaults(this);
......
......
......
}

build 完後可以直接在Chrome上使用

在 chrome 網址列上輸入:chrome://inspect/#devices
可以看到以下頁面:

App 在運作的時候 會出現一個新的 link
點下去就對了

會出現新的頁面
找到你自己的DB 跟 table 就可以看到存取是否有問題