在写DAO层时,觉得从Cursor里一个一个的取出字段值再装到VO(值对象)里太麻烦了,就写了一个工具类,用到了反射,可以把查询记录的值装到对应的VO里,也可以生成该VO的List。
使用时需要注意:
考虑到Android的性能问题,VO没有使用Setter和Getter,而是直接用public的属性。
表中的字段名需要和VO的属性名一样,要是不一样就得在查询的sql中使用字段别名让字段别名和VO属性名一样。
下面是高清有码:
- importjava.lang.reflect.Constructor;
- importjava.lang.reflect.Field;
- importjava.util.HashMap;
- importjava.util.LinkedList;
- importjava.util.List;
- importjava.util.Map;
- importandroid.database.Cursor;
- importandroid.database.sqlite.sqliteDatabase;
- /**
- *通过sql语句查询出结果并封闭到VO里
- *
- *@authordengzer@gmail.com
- *@version创建时间:2011-10-28下午05:27:39
- */
- publicclassHappysql{
- *通过sql语句获得对应的VO。注意:Cursor的字段名或者别名一定要和VO的成员名一样
- *@paramdb
- *@paramsql
- *@paramclazz
- *@return
- @SuppressWarnings("rawtypes")
- staticObjectsql2VO(sqliteDatabasedb,Stringsql,Classclazz){
- Cursorc=db.rawQuery(sql,null);
- returncursor2VO(c,clazz);
- }
- *@paramselectionArgs
- *@paramclazz
- *@return
- */
- @SuppressWarnings("rawtypes")
- String[]selectionArgs,Classclazz){
- *通过sql语句获得对应的VO的List。注意:Cursor的字段名或者别名一定要和VO的成员名一样
- staticListsql2VOList(sqliteDatabasedb,153); background-color:inherit; font-weight:bold">returncursor2VOList(c,0); background-color:inherit">*通过Cursor转换成对应的VO。注意:Cursor里的字段名(可用别名)必须要和VO的属性名一致
- *@paramc
- @SuppressWarnings({"rawtypes","unused"})
- privatestaticObjectcursor2VO(Cursorc,Classclazz){
- if(c==null){
- returnnull;
- }
- Objectobj;
- inti=1;
- try{
- c.moveToNext();
- obj=setValues2Fields(c,clazz);
- returnobj;
- }catch(Exceptione){
- System.out.println(e);
- System.out.println("ERROR@:cursor2VO");
- finally{
- c.close();
- *通过Cursor转换成对应的VO集合。注意:Cursor里的字段名(可用别名)必须要和VO的属性名一致
- "unchecked"})
- staticListcursor2VOList(Cursorc,255); color:inherit; line-height:21px"> Listlist=newLinkedList();
- Objectobj;
- while(c.moveToNext()){
- list.add(obj);
- returnlist;
- }catch(Exceptione){
- e.printStackTrace();
- System.out.println("ERROR@:cursor2VOList");
- null;
- finally{
- c.close();
- /**
- *把值设置进类属性里
- *
- *@paramcolumnNames
- *@paramfields
- *@paramc
- *@paramobj
- *@throwsException
- staticObjectsetValues2Fields(Cursorc,Classclazz)
- throwsException{
- String[]columnNames=c.getColumnNames();//字段数组
- Objectobj=clazz.newInstance();
- Field[]fields=clazz.getFields();
- for(Field_field:fields){
- Class<?extendsObject>typeClass=_field.getType();//属性类型
- for(intj=0;j<columnNames.length;j++){
- StringcolumnName=columnNames[j];
- typeClass=getBasicClass(typeClass);
- booleanisBasicType=isBasicType(typeClass);
- if(isBasicType){
- if(columnName.equalsIgnoreCase(_field.getName())){//是基本类型
- String_str=c.getString(c.getColumnIndex(columnName));
- if(_str==break;
- _str=_str==null?"":_str;
- Constructor<?extendsObject>cons=typeClass
- .getConstructor(String.class);
- Objectattribute=cons.newInstance(_str);
- _field.setAccessible(true);
- _field.set(obj,attribute);
- else{
- Objectobj2=setValues2Fields(c,typeClass);//递归
- _field.set(obj,obj2);
- break;
- *判断是不是基本类型
- *@paramtypeClass
- staticbooleanisBasicType(ClasstypeClass){
- if(typeClass.equals(Integer.class)||typeClass.equals(Long.class)
- ||typeClass.equals(Float.class)
- ||typeClass.equals(Double. ||typeClass.equals(Boolean. ||typeClass.equals(Byte. ||typeClass.equals(Short. ||typeClass.equals(String.class)){
- true;
- else{
- false;
- *获得包装类
- *@paramtypeClass
- @SuppressWarnings("all")
- staticClass<?extendsObject>getBasicClass(ClasstypeClass){
- Class_class=basicMap.get(typeClass);
- if(_class==null)
- _class=typeClass;
- return_class;
- staticMap<Class,Class>basicMap=newHashMap<Class,Class>();
- static{
- basicMap.put(int.class,Integer.class);
- basicMap.put(long.float.double.boolean.byte.short. }
调用例子:
获得单个VO:
Stringsql="select*fromtb_info_reviewwhereinfo_id="
+info_id;
return(Info_re)Happysql.sql2VO(db,sql,92); line-height:21px"> Info_re.class);
获得List:
Stringsql="select*fromtb_infom,tb_sub2fwherem.send_state=1andreview_state=0andm.info_id=f.info_id";