SQLite反射封装

该博客介绍了一种通过传入bean对象来简化SQLite数据库操作的方法。主要聚焦于基本数据类型的字段,如有更复杂需求,作者表示愿意提供帮助。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

        }
    }
}

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值