Android應用開發使用資料庫的資料模型示例
背景
幾乎所有應用都有持久化儲存資料的需要。臨時性儲存savedInstanceState顯然無法勝任。為此,Android提供了長期儲存地:手機或平板裝置快閃記憶體上的本地檔案系統。 Android裝置上的應用都有一個沙盒目錄。將檔案儲存在沙盒中,可阻止其他應用甚至是裝置使用者的訪問和窺探。(當然,如果裝置被root了的話,使用者就可以為所欲為。)應用的沙盒目錄是/data/data/[應用的包名稱]。 需要儲存大量資料時,大多數應用都不會使用類似txt這樣的普通檔案。這時候需要使用資料庫。SQLite是類似於MySQL和PostgreSQL的開源關係型資料庫。不同於其他資料庫的是,SQLite使用單個檔案儲存資料,讀寫資料時使用SQLite庫。Android標準庫包含SQLite庫以及配套的一些Java輔助類。
示例
基本框架
設計一個用來儲存LAB顏色空間的資料類物件。
public class ColorSpace { private UUID mId; private String mColorName; private String mL; private String mA; private String mB; //IDE自動生成的getter和setter,不在展示 //自定義的get和set方法 public String getLABString() { return getL() + "," + getA() + "," + getB(); } public int[] getLABInt() { int[] lab = new int[3]; lab[0] = Integer.parseInt(getL()); lab[1] = Integer.parseInt(getA()); lab[2] = Integer.parseInt(getB()); return lab; } public void setLABString(String str) { String[] ss = str.split(","); if (ss.length == 3) { setL(ss[0]); setA(ss[1]); setB(ss[2]); } } public void setLABInt(int l, int a, int b) { setL(String.valueOf(l)); setA(String.valueOf(a)); setB(String.valueOf(b)); } }
這個資料模型用來儲存一個顏色以及它對應的LAB顏色空間的L,A,B通道的值,UUID是儲存資料庫時用到的一個數據。
一個應用中會用到多個顏色,那麼需要設計一個ColorSpaceLab類來管理。
public class ColorSpaceLab { private static ColorSpaceLab sColorSpaceLab; private Context mContext; private SQLiteDatabase mDatabase; public static ColorSpaceLab get(Context context) { if (sColorSpaceLab == null) { sColorSpaceLab = new ColorSpaceLab(context); } return sColorSpaceLab; } private ColorSpaceLab(Context context) { mContext = context.getApplicationContext(); mDatabase = BaseHelper.get(context).getReadableDatabase(); } private ColorSpaceCursorWrapper queryColorSpaces(String whereClause, String[] whereArgs) { Cursor cursor = mDatabase.query( ColorSpaceTable.NAME, null, // Columns - null selects all columns whereClause, whereArgs, null, // groupBy null, // having null // orderBy ); return new ColorSpaceCursorWrapper(cursor); } private static ContentValues getContentValues(ColorSpace colorSpace) { ContentValues values = new ContentValues(); values.put(ColorSpaceTable.Cols.UUID, colorSpace.getId().toString()); values.put(ColorSpaceTable.Cols.COLOR_NAME, colorSpace.getColorName()); values.put(ColorSpaceTable.Cols.L, colorSpace.getL()); values.put(ColorSpaceTable.Cols.A, colorSpace.getA()); values.put(ColorSpaceTable.Cols.B, colorSpace.getB()); return values; } public void addColorSpace(ColorSpace c) { ContentValues values = getContentValues(c); mDatabase.insert(ColorSpaceTable.NAME, null, values); } public void deleteColorSpace(ColorSpace c){ String uuidString = c.getId().toString(); mDatabase.delete(ColorSpaceTable.NAME, ColorSpaceTable.Cols.UUID+"=?",new String[]{ uuidString }); } public void deleteAllColorSpace(){ List<ColorSpace> colorSpaces= getColorSpaces(); for(int i = 0;i<colorSpaces.size();i++) { deleteColorSpace(colorSpaces.get(i)); } } public List<ColorSpace> getColorSpaces() { List<ColorSpace> colorSpaces = new ArrayList<>(); ColorSpaceCursorWrapper cursor = queryColorSpaces(null, null); try { cursor.moveToFirst(); while (!cursor.isAfterLast()) { colorSpaces.add(cursor.getColorSpace()); cursor.moveToNext(); } } finally { cursor.close(); } return colorSpaces; } public ColorSpace getColorSpace(UUID id) { ColorSpaceCursorWrapper cursor = queryColorSpaces( ColorSpaceTable.Cols.UUID + " = ?", new String[] { id.toString() } ); try { if (cursor.getCount() == 0) { return null; } cursor.moveToFirst(); return cursor.getColorSpace(); } finally { cursor.close(); } } public void updateColorSpacebyID(ColorSpace colorSpace){ String uuidString = colorSpace.getId().toString(); ContentValues values = getContentValues(colorSpace); mDatabase.update(ColorSpaceTable.NAME, values, ColorSpaceTable.Cols.UUID + " = ?", new String[] { uuidString }); } public void updateColorSpacebyName(ColorSpace colorSpace){ String name = colorSpace.getColorName(); ContentValues values = getContentValues(colorSpace); mDatabase.update(ColorSpaceTable.NAME, values, ColorSpaceTable.Cols.COLOR_NAME + " = ?", new String[] { name }); } }
類的中自身的靜態變數sColorSpaceLab表明這個類只能被例項化一次,因為一個應用只需要一個顏色管理類。
mContext變數可以保證只要首次建立ColorSpaceLab時的介面每有被銷燬,該類就一直存在,不會被自動清理。
SQLiteDatabase型別的mDatabase變數說明該類使用SQLite管理多個顏色空間資料。
在顏色管理類ColorSpaceLab中實現的功能有查詢,增加,刪除,按UUID和按顏色名稱更新。
用到的底層類定義
該類用到了一些更加底層的操作BaseHelper,ColorSpaceCursorWrapper和ColorSpaceTable。
ColorSpaceTable是資料庫表格表頭的定義
public class ColorSpaceDbSchema {
public static final class ColorSpaceTable {
public static final String NAME = "colorspace";
public static final class Cols {
public static final String UUID = "uuid";
public static final String COLOR_NAME = "color_name";
public static final String L = "l";
public static final String A = "a";
public static final String B = "b";
}
}
}
BaseHelper用來建立資料庫
public class BaseHelper extends SQLiteOpenHelper {
private static BaseHelper sBaseHelper;
public static BaseHelper get(Context context) {
if (sBaseHelper == null) {
sBaseHelper = new BaseHelper(context);
}
return sBaseHelper;
}
private static final int VERSION = 1;
private static final String DATABASE_NAME = "templateBase.db";
public BaseHelper(Context context) {
super(context, DATABASE_NAME, null, VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("create table " + ColorSpaceTable.NAME + "(" +
" _id integer primary key autoincrement, " +
ColorSpaceTable.Cols.UUID + ", " +
ColorSpaceTable.Cols.COLOR_NAME + ", " +
ColorSpaceTable.Cols.L + ", " +
ColorSpaceTable.Cols.A + ", " +
ColorSpaceTable.Cols.B +
")"
);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
當然,在這個資料庫中可以新建多張表
ColorSpaceCursorWrapper用來從資料庫得到的記錄中還原出ColorSpace
public class ColorSpaceCursorWrapper extends CursorWrapper {
public ColorSpaceCursorWrapper(Cursor cursor) {
super(cursor);
}
public ColorSpace getColorSpace() {
String uuidString = getString(getColumnIndex(ColorSpaceTable.Cols.UUID));
String color_name = getString(getColumnIndex(ColorSpaceTable.Cols.COLOR_NAME));
String l = getString(getColumnIndex(ColorSpaceTable.Cols.L));
String a = getString(getColumnIndex(ColorSpaceTable.Cols.A));
String b = getString(getColumnIndex(ColorSpaceTable.Cols.B));
ColorSpace colorSpace = new ColorSpace(UUID.fromString(uuidString));
colorSpace.setColorName(color_name);
colorSpace.setL(l);
colorSpace.setA(a);
colorSpace.setB(b);
return colorSpace;
}
}
有了這些,資料模型的底層就定義完了。
資料模型的使用
在使用時,只需要簡單的幾行程式就可以實現顏色空間資料的永久儲存。
ColorSpaceLab colorSpaceLab = ColorSpaceLab.get(getActivity());
ColorSpace colorSpace = new ColorSpace();
//colorSpace更新
colorSpaceLab.addColorSpace(colorSpace);
colorSpaceLab.updateColorSpacebyName(colorSpace);