操作表
操作表之前的优化/前置工作
缓存表字段
public class BaseDao<T> implements IBaseDao<T> {
//...其他代码
//创建一个缓存,缓存表的字段对应的java实体类成员变量
//key是表的字段
//value是对应的java实体类的成员变量Field对象
private HashMap<String, Field> cacheMap;
//架构内部的逻辑不要提供构造方法给调用层使用,表明靠反射来获得
public void init(SQLiteDatabase sqLiteDatabase, Class<T> entityClass) {
//...其他代码
if (!isInit) {
//...其他代码
//初始化成员变量缓存
initCacheMap();
isInit = true;
}
}
//初始化缓存
private void initCacheMap() {
//new一个map集合
if (cacheMap == null)
cacheMap = new HashMap<>();
//取得所有字段名字,通过查询目标表
String sql = "select * from " + tableName + " limit 1,0";//空表
//获得游标
Cursor cursor = sqLiteDatabase.rawQuery(sql, null);
获得表的所有列名
String[] columnNames = cursor.getColumnNames();
//取得所有java对象的公共成员变量
Field[] declaredFields = entityClass.getDeclaredFields();
//打开所有字段的访问权限
for (Field field : declaredFields) {
field.setAccessible(true);
}
//字段和对象成员变量一一对应
//循环数据库中查出来的表中的字段名
for (String columnName : columnNames) {
Field columnField = null;
//循环传进来的java实体类的成员变量
for (Field field : declaredFields) {
//得到成员变量名
String fieldName;
DbField dbField = field.getAnnotation(DbField.class);
if (dbField != null) {
fieldName = dbField.value();
} else {
fieldName = field.getName();
}
//表的列名和java对象的成员变量名对应上了,则缓存起来
if (!TextUtils.isEmpty(columnName) && columnName.equals(fieldName)) {
columnField = field;
break;
}
}
//在数据库中匹配到了参数和值,则缓存起来
if (columnField != null) {
cacheMap.put(columnName, columnField);
}
}
cursor.close();
}
}
处理传递进来的数据
将传递进来的对象转化成:表字段—java值的形式
public class BaseDao<T> implements IBaseDao<T> {
//...其他代码
//将传递进来的java对象处理成表字段-entity值的map对象
//这里使用缓存去检查传入的属性与表的列是否对应
private Map<String, String> getValues(T entity) {
HashMap<String, String> map = new HashMap<>();
//取出缓存中的表字段名和对应的java对象的Field对象
for(Map.Entry<String,Field> entry:cacheMap.entrySet()){
//获得缓存的Field对象
Field field = entry.getValue();
//设置可访问变量
field.setAccessible(true<