反射是一个好东东,尤其是在与数据库打交道的时候。
如果没有现成的数据映射框架,要与大量的数据表打交道的话,技术含量就是与一个表打交道的那么多技术,可是要是有几十个数据表的话,就会很费劲来了,不用思考,直接的复制 粘贴 ,耗费时间不说,而且还有耗费咱们的精力和感情,既然都差不多为什么不让程序自己去重复呢?
我刚才就遇到这个问题了,我想这是可以做到的,于是乎就尝试这座了一下,一下只是一个雏形,不过已经能基本解决我的问题了。我是一个码农,我了解码农的心情,来吧,看码:
/***
* 用暴力反射来把数据存入数据库
*
* @throws IllegalAccessException
* @throws IllegalArgumentException
*/
private void updateArray(List list) throws IllegalArgumentException,
IllegalAccessException {
if (list == null || list.size() == 0) {
return;
}
Object obj = list.get(0);
Log.i("updateArray(List)", list.size() + "--"
+ obj.getClass().getCanonicalName());
// /根据对象的类型来确定数据表
String table = obj.getClass().getSimpleName();
// /根据类的成员变量来确定要查询那些列
Field[] fields = obj.getClass().getDeclaredFields();
String[] columns = new String[fields.length];
// /初始化列名
for (int i = 0; i < columns.length; i++) {
fields[i].setAccessible(true);
columns[i] = fields[i].getName();
}
SQLiteDatabase db = dbHelper.getWritableDatabase();
db.delete(table, null, null);
for (int i = 0; i < list.size(); i++) {
Object o = list.get(i);
ContentValues val = new ContentValues();
for (int j = 0; j < columns.length; j++) {
Class<?> type = fields[j].getType();
if (type == double.class) {
double value = fields[j].getDouble(o);
val.put(columns[j], value);
} else if (type == int.class) {
int value = fields[j].getInt(o);
val.put(columns[j], value);
} else {
String value = String.valueOf(fields[j].get(o));
val.put(columns[j], value);
}
}
db.insert(table, null, val);
}
}
/***
* 获取指定类型的所有的数据
*
* @param cls
* @return
*/
private Object getArrays(Class cls) {
Field[] fields = cls.getDeclaredFields();
String[] names = new String[fields.length];
for (int i = 0; i < names.length; i++) {
Field f = fields[i];
f.setAccessible(true);
fields[i].setAccessible(true);
names[i] = f.getName();
}
String tableName = cls.getSimpleName();
List entities = new ArrayList();
SQLiteDatabase db = dbHelper.getReadableDatabase();
Cursor cursor = db
.query(tableName, names, null, null, null, null, null);
try {
while (cursor.moveToNext()) {
Object entity = cls.newInstance();
for (Field f : fields) {
f.setAccessible(true);
// /用反射来调用相应的方法
// /先构造出方法的名字
String typeName = f.getType().getSimpleName();
// /int --> Int,doble--->Double
typeName = typeName.substring(0, 1).toUpperCase()
+ typeName.substring(1);
// /cuosor 的方法的名字
String methodName = "get" + typeName;
// /得到方法
Method method = cursor.getClass().getMethod(methodName,
int.class);
Object retValue = method.invoke(cursor,
cursor.getColumnIndex(f.getName()));
f.set(entity, retValue);
// f.set(entity, cursor.)
}
entities.add(entity);
}
} catch (NullPointerException ex) {
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
if(cursor != null){
cursor.close();
}
if(db != null){
db.close();
}
}
return entities;
}
我写了一部分注释,这两个函数不是很难懂,感觉这可能还会被用到,在此先记下来,与大家分享。