1. 程式人生 > >Android應用開發使用資料庫的資料模型示例

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);