注解、反射实现SQLite操作

年前在看Annitation相关的知识,看着看着就想写点东西验证一下成绩,于是就有个这个SounderDao
先附上github地址SounderDao
先谈谈工具的思路:通过注解和反射将每个实体类解析为一个Table对象(Table中保存有数据表字段信息,表名称,建表语句信息),然后将Table保存到TableManager中,这样不必每次都需要去解析实体类,然后在Dao中实现增删查改的操作。
类文件结构如下:
这里写图片描述
其中annotation包中的Constraint为字段属性注解,FieldType为枚举常量类,Table为表名称注解,注意下面还有一个Table类,那是表信息类(怪我,取名字时把没注意上面的注解);Dao中就是一些数据库的操作处理了,model包中的Param为表字段的属性,如字段名称,字段类型等等;resolver包中的Resolver时注解解析器,util里的ComparatorUtil时集合排序类,对表里面的字段进行一次排序,让结果美观一点点。。。

使用步骤
1、解析出所有表信息
使用Dao中的静态方法initTables(Class

for(String key : TableManager.getInstance().getTableHashMap().keySet()){              db.execSQL(TableManager.getInstance().getTableHashMap().get(key).getCreateTableStatement());
}

    1
    2

在调用Dao.initTables()以后,就需要调用Dao.getInstance().setSQLiteOpenHelper()方法设置Helper对象,方才能够获取到SQLiteDatabase对象。(数据库会在SQLiteOpenHelper调用getXXXDatabase()后才会创建)
接下来就可进行数据表的操作了。

(ps:增删修改操作方法都在Dao类中)

public void insert(Object object){
        Table table = TableManager.getInstance().get(object.getClass());
        if(table == null){
            throw new IllegalArgumentException("当前不存在该数据表信息");
        }
        //通过反射获取属性值并设置键值对
        ContentValues cv = new ContentValues();
        for(Param p : table.getParams()){
            if(p.isPrimarykey()){
                continue;
            }
            try {
                Field field = object.getClass().getDeclaredField(p.getName());
                field.setAccessible(true);
                if(p.getType().equals(FieldType.TEXT.getType())){
                    cv.put(p.getColumn(),(String)field.get(object));
                }else if(p.getType().equals(FieldType.INTEGER.getType())){
                    cv.put(p.getColumn(),(int)field.get(object));
                }
            } catch (NoSuchFieldException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        }
        mSQLiteDatabase = mSQLiteOpenHelper.getWritableDatabase();
        long id = mSQLiteDatabase.insert(table.getTableName(),null,cv);
        System.out.println("插入操作返回的id---->"+id);
    }

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29



public int delete(Class<?> clz,String whereClause,String[] whereArgs){
        Table table = TableManager.getInstance().get(clz);
        if(table == null){
            throw  new IllegalArgumentException("没有当前表信息"+clz.getSimpleName());
        }
        mSQLiteDatabase = mSQLiteOpenHelper.getWritableDatabase();
        return mSQLiteDatabase.delete(table.getTableName(),whereClause,whereArgs);
    }

    1
    2
    3
    4
    5
    6
    7
    8



public ArrayList<Object> query(Class<?> clz, String whereClause){
        Table table = TableManager.getInstance().get(clz);
        if(table == null){
            throw  new IllegalArgumentException("没有当前表信息"+clz.getSimpleName());
        }
        ArrayList<Object> results = new ArrayList<>();
        //查询全部
        String sql = "select * from "+table.getTableName();
        if(!TextUtil.isEmpty(whereClause)){
            sql += " where "+whereClause;
        }
        sql += ";";
        mSQLiteDatabase = mSQLiteOpenHelper.getReadableDatabase();
        Cursor cursor = mSQLiteDatabase.rawQuery(sql,null);
        while (cursor.moveToNext()){
            try {
                Object object = clz.newInstance();
                for(Param p : table.getParams()){
                    Field field = clz.getDeclaredField(p.getName());
                    field.setAccessible(true);
                    if(p.getType().equals(FieldType.INTEGER.getType())){
                        field.set(object,cursor.getInt(cursor.getColumnIndexOrThrow(p.getColumn())));
                    }else{
                        field.set(object,cursor.getString(cursor.getColumnIndexOrThrow(p.getColumn())));
                    }
                }
                results.add(object);
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (InstantiationException e) {
                e.printStackTrace();
            } catch (NoSuchFieldException e) {
                e.printStackTrace();
            }
        }
        cursor.close();
        return results;
    }

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38



public int update(Class<?> clz,ContentValues cv,String whereClause,String[] whereArgs){
        Table table = TableManager.getInstance().get(clz);
        if(table == null){
            throw  new IllegalArgumentException("没有当前表信息"+ clz.getSimpleName());
        }
        mSQLiteDatabase = mSQLiteOpenHelper.getWritableDatabase();
        return mSQLiteDatabase.update(table.getTableName(),cv,whereClause,whereArgs);
    }

    1
    2
    3
    4
    5
    6
    7
    8

最后贴上本次测试Entity:Music

@Table("tb_music")
public class Music {
    @Constraint(name = "_id",type = FieldType.INTEGER,primaryKey = true,autoInCrement = true)
    private int id;

    @Constraint(name = "_title")
    private String title;

    @Constraint(name = "_artist")
    private String artist;
    //省略了getter和setter方法
}
---------------------
作者:川黑今
来源:CSDN
原文:https://blog.csdn.net/u011146263/article/details/54848618
版权声明:本文为博主原创文章,转载请附上博文链接!

posted @ 2019-05-22 22:35  天涯海角路  阅读(325)  评论(0)    收藏  举报