SQLite反射封裝

overview:只需傳入一個bean對象,即可完成數據庫相關操作。(本文字段數據類型只取了簡單兩種,如有需要,請在對應地方添加。不會的,@我。thanks)

public class DbUtils<T> {
    private static final String DB_NAME = "student";
    private static final String TYPE_INT = "int";
    private static final String TYPE_STRING = "String";
    private static final String DB_FLOAT = "student";
    private static final String DB_BOOLEAN = "student";
    private static final String TABLE_ID = "id";
    private static final int DB_VERSION = 1;
    private String tableName;
    private Context context;
    private Class cls;
    private SQLiteDatabase db;
    private final Field[] fs;

    public DbUtils(Context context, T table) {
        SQLiteHelper helper = new SQLiteHelper(context, DB_NAME, null, DB_VERSION);
        db = helper.getReadableDatabase();//connect database
        cls = table.getClass();
        tableName = cls.getSimpleName();
        fs = cls.getDeclaredFields();
        this.context = context;
        newTable();//create a table if it does not exist
    }

    //create table
    public void newTable() {
        String sql = "create table if not exists " + tableName + "(";
        if (!contain(fs, TABLE_ID)) {
            sql += TABLE_ID + " integer primary key autoincrement";
        }
        for (int i = 0; i < fs.length; i++) {
            if (fs[i].getName().equals(TABLE_ID)) {
                sql += TABLE_ID + " integer primary key autoincrement";
                continue;
            }
            switch (fs[i].getType().getSimpleName()) {
                case TYPE_INT:
                    sql += "," + fs[i].getName() + " integer";
                    break;
                case TYPE_STRING:
                    sql += "," + fs[i].getName() + " text";
                    break;
            }
        }
        sql += ")";
        db.execSQL(sql);
    }

    //insert
    public void insert(T obj) {
        db.insert(tableName, insertColumns(), insertValues(obj));
        ToastUtils.simpleToast(context, "插入成功");
    }

    //delete by id
    public void delete(int id) {
        db.delete(tableName, "id=?", new String[]{String.valueOf(id)});
        ToastUtils.simpleToast(context, "刪除成功");
    }

    //update
    public void update(T obj, int id) {
        db.update(tableName, insertValues(obj), "id=?", new String[]{String.valueOf(id)});
        ToastUtils.simpleToast(context, "修改成功");
    }

    //query by id
    public T queryById(int id) {
        T result = null;
        Cursor cursor = db.query(tableName, null, "id=?", new String[]{String.valueOf(id)}, null, null, null);
        while (cursor.moveToNext()) {
            try {
                result = (T) cls.newInstance();
                setValues(result, cursor);
            } catch (InstantiationException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        }

        return result;
    }

    //query all
    public ArrayList<T> queryAll() {
        ArrayList<T> results = new ArrayList<>();
        T res = null;
        Cursor cursor = db.query(tableName, null, null, null, null, null, null);
        while (cursor.moveToNext()) {
            try {
                res = (T) cls.newInstance();
                setValues(res, cursor);
                results.add(res);
            } catch (InstantiationException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        }
        return results;
    }

    //disconnect
    public void close() {
        db.close();
    }

    //set values for query result
    private void setValues(T result, Cursor cursor) throws IllegalAccessException {
        for (Field f : fs) {
            f.setAccessible(true);
            switch (f.getType().getSimpleName()) {
                case TYPE_INT:
                    f.setInt(result, cursor.getInt(cursor.getColumnIndex(f.getName())));
                    break;
                case TYPE_STRING:
                    f.set(result, cursor.getString(cursor.getColumnIndex(f.getName())));
                    break;
            }
        }
    }

    //set insert obj
    private ContentValues insertValues(T obj) {
        ContentValues values = new ContentValues();
        for (Field f : fs) {
            try {
                f.setAccessible(true);
                switch (f.getType().getSimpleName()) {
                    case TYPE_INT:
                        values.put(f.getName(), Integer.parseInt(f.get(obj).toString()));
                        break;
                    case TYPE_STRING:
                        values.put(f.getName(), f.get(obj).toString());
                        break;
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return values;
    }

    //use for setting insert columns
    private String insertColumns() {
        String ins = "";
        //if (!contain(fs, TABLE_ID)) ins += TABLE_ID;
        for (int i = 0; i < fs.length; i++) {
            ins += "," + fs[i].getName();
        }
        return ins.substring(1,ins.length());
    }

    //use for judging whether tableInfo contains tableId
    private boolean contain(Field[] tableInfo, String tableId) {
        for (int i = 0; i < tableInfo.length; i++) {
            if (tableInfo[i].getName().equals(tableId)) return true;
        }
        return false;
    }

    private class SQLiteHelper extends SQLiteOpenHelper {
        public SQLiteHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
            super(context, name, factory, version);
        }

        @Override
        public void onCreate(SQLiteDatabase db) {

        }

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

        }
    }
}

這裏寫圖片描述

發佈了37 篇原創文章 · 獲贊 3 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章