Android - 初心者 - SQLite (1)

Android - 初心者 - SQLite (1)

過往我都是以解決問題撰寫文章,

但現在我常常需要重頭回來開始碰的時候,就會需要入門級的文章,省去我重新回憶與實作的時間。

這次我又從PHP到Java又回到了Android,開始撰寫App,並被賦予的任務是撰寫SQLite的功能。

因此要重新摸索,我發現我忘了,所以我要以一個忘記怎麼寫,要怎麼快速的寫出一個SQLite的功能。

並發現過去的結構,我突然有點看不懂,所以我改寫成一些網頁工程師、資料庫工程師或我,所看得懂的術語。

如package我就以db資料夾以下都是屬於資料庫存取相關的類別部分,並建立Dao資料夾,做為資料存取層的部分(類型一個Table一個Dao物件,負責處理各Table的CRUD)

再來model 資料夾,為各個Table取出來的資料的實體類別物件。

而SQLiteDatabaseHelper,則還是以原本Android的名稱為主,不然他就會類似是MysqlConnection還是SqlConnection之類的東西。

這樣的過程,就有點像,我要取得一個物件,Member,就要透過MemberDao,MemberDao就會透過連結物件SQLiteDatabaseHelper去與實體檔案SQLite進行下達指令。

整段過程就會是Member->MemberDao->SQLiteDatabaseHelper->SQLite

而我將Schema的規格也寫入了Dao裡的子類別

    public static class Schema {
        public static final String TableName = "member";
        /**
             * Define table schema
             */
        public static class Columns {
            public static final String Id = "id";
            public static final String Name = "name";
        };
    }

建立一個BaseDao,所有Dao繼承這個BaseDao,以容易初始化SQLiteDatabaseHelper

public class BaseDao {
    protected SQLiteDatabaseHelper mSQLite;

    public BaseDao(Context context) {
        mSQLite = new SQLiteDatabaseHelper(context);
    }
}

而SQLiteDatabaseHelper我也用極簡的方式處理

public class SQLiteDatabaseHelper extends SQLiteOpenHelper {
    private static final String mDatabaseName = "my_app";
    private static final int mVersion = 1;
    private Context context ;

    public SQLiteDatabaseHelper(Context context) {
        super(context, mDatabaseName, null, mVersion);
        this.context = context;
    }

    public SQLiteDatabaseHelper(Context context, String name, CursorFactory factory) {
        super(context, name, factory, mVersion);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(MemberDao.getCraeteTableSQL());
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("DROP TABLE IF EXISTS " + MemberDao.Schema.TableName) ;
        db.execSQL(MemberDao.getCraeteTableSQL());
    }
}

我這裡,撰寫的是,當資料庫版本有異動時,就直接砍掉重練

如果要做差異變動,參考過我去的文章

https://dotblogs.com.tw/newmonkey48/2014/06/05/145386

因為以前解決問題的文章,無法讓我快速入門撰寫基本功能,所以我這次寫的是,抄了就可以直接使用的功能。

Dao就會撰寫如下

public class MemberDao extends BaseDao{
    private static MemberDao sInst;

    public static class Schema {
        public static final String TableName = "member";
        /**
         * Define table schema
         */
        public static class Columns {
            public static final String Id = "id";
            public static final String Name = "name";
        };
    }

    public MemberDao(Context context) {
        super(context);
    }

    public synchronized static MemberDao getInstance(Context context) {
        if (sInst == null) {
            sInst = new MemberDao(context);
        }
        return sInst;
    }

    public static String getCraeteTableSQL() {
        return "CREATE TABLE IF NOT EXISTS `"
                + Schema.TableName + "`(" + "`"
                + Schema.Columns.Id + "` TEXT KEY UNIQUE," + "`"
                + Schema.Columns.Name + "` TEXT)";
    }
}

這裡我只撰寫最基本的功能,建立一個db及table。

至於一下步要進行新增查改修的程式撰寫或存取功能,有空再寫第二篇文章。

撰寫文章的動力,一切都是一個「懶字」。

回頭再寫以前寫過的東西,突然腦袋一片空白。(後來回憶起來,好像也只不過是30分鐘的事)