[Android] SQLiteOpenHelper

第一次自已寫SQLite ….

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

以下先用自己的sample說明

Implement

這邊使用 SQLiteOpenHelper實作

先新增一個class, extends SQLiteOpenHelper

public class DatabaseHelper extends SQLiteOpenHelper {}

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

    @Override
    public void onCreate(SQLiteDatabase db) {
        // onCreate 會在app發現沒有Database檔案時呼叫, 不是每次都會呼叫到
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // Database版本更新時
    }

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

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 參考以下

CREATE TABLE table_name (
  column_name1 data_type,
  column_name2 data_type,
  column_name3 data_type,
  ···
);

轉換成Android要帶入的

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 :


    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版本更新時
    }

到這邊就可以使用了

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 加入

compile 'com.facebook.stetho:stetho:1.4.2'

在MainAavitity 的 onCreate() 中加入

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 就可以看到存取是否有問題