SQLite的工具类 ---- 通过反射把Cursor封装到VO对象

前端之家收集整理的这篇文章主要介绍了SQLite的工具类 ---- 通过反射把Cursor封装到VO对象前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

在写DAO层时,觉得从Cursor里一个一个的取出字段值再装到VO(值对象)里太麻烦了,就写了一个工具类,用到了反射,可以把查询记录的值装到对应的VO里,也可以生成该VO的List。


使用时需要注意:

考虑到Android的性能问题,VO没有使用Setter和Getter,而是直接用public的属性

表中的字段名需要和VO的属性名一样,要是不一样就得在查询sql中使用字段别名让字段别名和VO属性名一样。


下面是高清有码:

  1. importjava.lang.reflect.Constructor;
  2. importjava.lang.reflect.Field;
  3. importjava.util.HashMap;
  4. importjava.util.LinkedList;
  5. importjava.util.List;
  6. importjava.util.Map;
  7. importandroid.database.Cursor;
  8. importandroid.database.sqlite.sqliteDatabase;
  9. /**
  10. *通过sql语句查询出结果并封闭到VO里
  11. *
  12. *@authordengzer@gmail.com
  13. *@version创建时间:2011-10-28下午05:27:39
  14. */
  15. publicclassHappysql{
  16. *通过sql语句获得对应的VO。注意:Cursor的字段名或者别名一定要和VO的成员名一样
  17. *@paramdb
  18. *@paramsql
  19. *@paramclazz
  20. *@return
  21. @SuppressWarnings("rawtypes")
  22. staticObjectsql2VO(sqliteDatabasedb,Stringsql,Classclazz){
  23. Cursorc=db.rawQuery(sql,null);
  24. returncursor2VO(c,clazz);
  25. }
  26. *@paramselectionArgs
  27. *@paramclazz
  28. *@return
  29. */
  30. @SuppressWarnings("rawtypes")
  31. String[]selectionArgs,Classclazz){
  32. *通过sql语句获得对应的VO的List。注意:Cursor的字段名或者别名一定要和VO的成员名一样
  33. staticListsql2VOList(sqliteDatabasedb,153); background-color:inherit; font-weight:bold">returncursor2VOList(c,0); background-color:inherit">*通过Cursor转换成对应的VO。注意:Cursor里的字段名(可用别名)必须要和VO的属性名一致
  34. *@paramc
  35. @SuppressWarnings({"rawtypes","unused"})
  36. privatestaticObjectcursor2VO(Cursorc,Classclazz){
  37. if(c==null){
  38. returnnull;
  39. }
  40. Objectobj;
  41. inti=1;
  42. try{
  43. c.moveToNext();
  44. obj=setValues2Fields(c,clazz);
  45. returnobj;
  46. }catch(Exceptione){
  47. System.out.println(e);
  48. System.out.println("ERROR@:cursor2VO");
  49. finally{
  50. c.close();
  51. *通过Cursor转换成对应的VO集合。注意:Cursor里的字段名(可用别名)必须要和VO的属性名一致
  52. "unchecked"})
  53. staticListcursor2VOList(Cursorc,255); color:inherit; line-height:21px"> Listlist=newLinkedList();
  54. Objectobj;
  55. while(c.moveToNext()){
  56. list.add(obj);
  57. returnlist;
  58. }catch(Exceptione){
  59. e.printStackTrace();
  60. System.out.println("ERROR@:cursor2VOList");
  61. null;
  62. finally{
  63. c.close();
  64. /**
  65. *把值设置进类属性
  66. *
  67. *@paramcolumnNames
  68. *@paramfields
  69. *@paramc
  70. *@paramobj
  71. *@throwsException
  72. staticObjectsetValues2Fields(Cursorc,Classclazz)
  73. throwsException{
  74. String[]columnNames=c.getColumnNames();//字段数组
  75. Objectobj=clazz.newInstance();
  76. Field[]fields=clazz.getFields();
  77. for(Field_field:fields){
  78. Class<?extendsObject>typeClass=_field.getType();//属性类型
  79. for(intj=0;j<columnNames.length;j++){
  80. StringcolumnName=columnNames[j];
  81. typeClass=getBasicClass(typeClass);
  82. booleanisBasicType=isBasicType(typeClass);
  83. if(isBasicType){
  84. if(columnName.equalsIgnoreCase(_field.getName())){//是基本类型
  85. String_str=c.getString(c.getColumnIndex(columnName));
  86. if(_str==break;
  87. _str=_str==null?"":_str;
  88. Constructor<?extendsObject>cons=typeClass
  89. .getConstructor(String.class);
  90. Objectattribute=cons.newInstance(_str);
  91. _field.setAccessible(true);
  92. _field.set(obj,attribute);
  93. else{
  94. Objectobj2=setValues2Fields(c,typeClass);//递归
  95. _field.set(obj,obj2);
  96. break;
  97. *判断是不是基本类型
  98. *@paramtypeClass
  99. staticbooleanisBasicType(ClasstypeClass){
  100. if(typeClass.equals(Integer.class)||typeClass.equals(Long.class)
  101. ||typeClass.equals(Float.class)
  102. ||typeClass.equals(Double. ||typeClass.equals(Boolean. ||typeClass.equals(Byte. ||typeClass.equals(Short. ||typeClass.equals(String.class)){
  103. true;
  104. else{
  105. false;
  106. *获得包装类
  107. *@paramtypeClass
  108. @SuppressWarnings("all")
  109. staticClass<?extendsObject>getBasicClass(ClasstypeClass){
  110. Class_class=basicMap.get(typeClass);
  111. if(_class==null)
  112. _class=typeClass;
  113. return_class;
  114. staticMap<Class,Class>basicMap=newHashMap<Class,Class>();
  115. static{
  116. basicMap.put(int.class,Integer.class);
  117. 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";

  • List<Info>infos=Happysql
  • .sql2VOList(db,Info.class);

  • 带变参获得List:

    Highlighter bg_java" style="font-family:Consolas,tb_ttffwherem.info_id=?andm.info_id=f.info_id";
  • return(SbMan)Happysql.sql2VO(db,newString[]{info_id+""},SbMan.class);
  • 原文链接:https://www.f2er.com/sqlite/202329.html

    猜你在找的Sqlite相关文章