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分鐘的事)