SQLite反射封装

来源:互联网 发布:安卓e4a编程工具手机版 编辑:程序博客网 时间:2024/04/28 06:33

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) {        }    }}

这里写图片描述

0 0
原创粉丝点击