博主主要是做java web后台这一块,但是偶尔做点安卓,发现安卓上没有像Hibernate这种orm框架(....其实也没有去找),
又觉得每次增删改查都自己写代码的话肯定是非常麻烦的,所以就写了一个简单的baseandroidDao来封装一些简单的增删改查 *** 作;
需要注意的是,此框架并非一个健全的orm框架,功能简单,而且这些功能必须采用博主约定的方式才能正确运行;
2.具体实现例举现在有一个javaBean如下,其如同Hibernate中的实体,但是却只是通过属性来存取值(博主嫌麻烦....没有用getter和setter那种标准方式,而且基本够用...)
public class User extends BaseEntity { public Long ID; public String Login_name; public String Password; public String Real_name; public Long State; public String UID; @Entity_FIEldProperty(FIEldType=FIEldType.JsonObject,cls=Sys_User_Info.class) public Sys_User_Info UserInfo; @OverrIDe public Long getID() { return ID; }}
约定一:所有实体(用来存储和数据库表数据相对应的bean)必须继承BaseEntity类,
约定二:同时属性的名称必须和数据库中的字段相一致;不过,主键必须是Long ID(不区分大小写),数据库中将会以_ID字段存储;
约定三:只支持Boolean,Date,Long,String,Integer,List,Objec,float,Double这几个包装类的属性,不支持数组类型;
约定四.通过Entity_FIEldProperty注解来实现对List,bean对象,静态对象的控制;
说明:这些约定都是很好改的.....如有需要可以下载之后自己该,最好是改成类似Hibernate那种注解识别ID的方式,然后给博主发一份过来嘿嘿;
其中BaseEntity主要是封装一些对Entity的 *** 作....具体代码如下(其实这些东东封装到Dao中,然后用Dao对Entity *** 作时最好的,这样Entity也不用继承BaseEntity)
以后有时间博主会重写结构然后更新(现在结构很垃圾..耦合重...),但是利用反射的核心代码不会这么变,所以大家可以看看:
/** * Entity约定: * 0.主键的名称必须是ID,不分大小写,数据库中以_ID存储 * 1.只支持Boolean,不支持数组类型 * 2.其它属性的值,不支持自动赋值与使用 * 3.通过Entity_FIEldProperty注解来实现对List,静态对象的控制; * @author dvIEw * */public abstract class BaseEntity { /** * 下面规定允许的数据类型 */ @JsONFIEld(serialize=false) private final String type_boolean="class java.lang.Boolean",type_date="class java.util.Date",type_float="class java.lang.float",type_double="class java.lang.Double",type_long="class java.lang.Long",type_integer="class java.lang.Integer",type_string="class java.lang.String"; @JsONFIEld(serialize=false) public final static String primaryKeyname="_ID"; /** * 判断一个属性是否是静态变量,此类暂时不用 * @param fIEld */ @JsONFIEld(serialize=false) public boolean isstaticFIEld(FIEld fIEld){ boolean isstatic = ModifIEr.isstatic(fIEld.getModifIErs()); return isstatic; } /** * 为本实体类赋值 * @throws IllegalArgumentException * @throws illegalaccessexception */ @JsONFIEld(serialize=false) private voID setFIEldValue(Cursor c) throws illegalaccessexception,IllegalArgumentException{ if(c==null) return; Class<?> clazz=this.getClass(); FIEld[] fs=clazz.getDeclaredFIElds(); for(FIEld f:fs){ int index=0;//cursor游标中的索引,某个字段 try{ f.setAccessible(true);//强制获取,设置值 Annotation[] as=f.getAnnotations(); Class<?> fclass=null; FIEldType fType=null; for(int i=0;i<as.length;i++){ Annotation a=as[i]; if(a instanceof Entity_FIEldProperty){ Entity_FIEldProperty ef=(Entity_FIEldProperty)a; if(ef!=null){ fclass=ef.cls(); fType=ef.FIEldType(); } break; } } String typestring=f.getGenericType().toString(); String name=f.getname(); if(name.tolowerCase(Locale.ENGliSH).equals("ID")) { name=primaryKeyname; } index=c.getColumnIndex(name); if(index==-1) continue; //按照基础六类属性来处理 if(fType==null||fType==FIEldType.Base){ if(typestring.equals(type_boolean)){ int result=c.getInt(index); f.set(this,(Boolean)(result==1)); }else if(typestring.equals(type_date)){ Long m=c.getLong(index); if(m!=null) { f.set(this,new Date(m)); }else{ f.set(this,null); } }else if(typestring.equals(type_integer)){ f.set(this,c.getInt(index)); }else if(type_long.equals(typestring)){ f.set(this,c.getLong(index)); }else if(typestring.equals(type_float)){ f.set(this,c.getfloat(index)); }else if(typestring.equals(type_double)){ f.set(this,c.getDouble(index)); }else{ f.set(this,c.getString(index)); } }else if(fType==FIEldType.TransIEnt){ continue; }else if(fType==FIEldType.JsonObject){ Object jobj=null; if(c.getString(index)!=null) JsonUtils_wg.parsetoObject(c.getString(index),fclass); f.set(this,jobj); }else if(fType==FIEldType.JsonList){ List<?> obJs = null; if(c.getString(index)!=null) obJs=JsonUtils_wg.parsetoArray(c.getString(index),obJs); } } catch (Exception e) { Log.e(this.getClass().getname(),e.toString()); e.printstacktrace(); continue; }//end try }//end for } /** * 以键值对的方式,返回单签类的,属性的名称和之所对应的值 * @return * @param isChangeIDString 是否改变属性名称为ID的键为BaseEntity.primaryKeyname所代表的属性值 * @throws IllegalArgumentException * @throws illegalaccessexception */ @JsONFIEld(serialize=false) private Map<String,Object> getFIEldValue(boolean isChangeIDString) throws illegalaccessexception,IllegalArgumentException{ Map<String,Object> maps=new HashMap<String,Object>(); Class<?> clazz=this.getClass(); FIEld[] fs=clazz.getDeclaredFIElds(); for(FIEld fIEld:fs){ fIEld.setAccessible(true); Annotation[] as=fIEld.getAnnotations(); Class<?> fclass=null; FIEldType fType=null; for(int i=0;i<as.length;i++){ Annotation a=as[i]; if(a instanceof Entity_FIEldProperty){ Entity_FIEldProperty ef=(Entity_FIEldProperty)a; if(ef!=null){ fclass=ef.cls(); fType=ef.FIEldType(); } break; } } String typestring=fIEld.getGenericType().toString(); String name=fIEld.getname(); if(name.tolowerCase(Locale.ENGliSH).equals("ID")&&isChangeIDString) { name=primaryKeyname; } //按照基础六类属性来处理 if(fType==null||fType==FIEldType.Base){ if(fIEld.get(this)==null){ maps.put(name,null); }else if(typestring.equals(type_boolean)){ if((Boolean)fIEld.get(this)) { maps.put(name,1); } else{ maps.put(name,0); } }else if(typestring.equals(type_date)){ Date d=(Date) fIEld.get(this); maps.put(name,d.getTime()); }else { maps.put(name,fIEld.get(this)); } }else if(fType==FIEldType.TransIEnt){ continue; }else if(fType==FIEldType.JsonObject){ if(fIEld.get(this)==null) { maps.put(name,"{}"); }else{ String JsonString=JsON.toJsONString(fIEld.get(this)); maps.put(name,JsonString); } }else if(fType==FIEldType.JsonList){ if(fIEld.get(this)==null) { maps.put(name,"[]"); }else{ String JsonString=JsON.toJsONString(fIEld.get(this)); maps.put(name,JsonString); } } } return maps; } //通过Cursor自动将值赋值到实体 @JsONFIEld(serialize=false) public voID initFromCursor(Cursor c) throws illegalaccessexception,IllegalArgumentException{ setFIEldValue(c); } @JsONFIEld(serialize=false) public ContentValues getContentValues() throws illegalaccessexception,IllegalArgumentException { ContentValues cv; cv=new ContentValues(); Map<String,Object> maps=getFIEldValue(true); Set<String> keys=maps.keySet(); for(String s:keys){ try{ Object obj=maps.get(s); String typestring=obj.getClass().getname(); if(obj==null){ cv.put(s,""); }else if(typestring.equals(type_boolean)){ cv.put(s,(Boolean)(obj)); }else if(typestring.equals(type_date)){ cv.put(s,((Date)(obj)).getTime()); }else if(typestring.equals(type_integer)){ cv.put(s,(Integer)(obj)); }else if(type_long.equals(typestring)){ cv.put(s,((Long)(obj))); }else if(typestring.equals(type_float)){ cv.put(s,(float)(obj)); }else if(typestring.equals(type_double)){ cv.put(s,(Double)(obj)); }else if(typestring.equals(type_string)){ cv.put(s,(String)(obj)); }else{ cv.put(s,JsON.toJsONString(obj)); } } catch (Exception e) { Log.e(this.getClass().getname(),e.toString()); e.printstacktrace(); continue; } }//end for return cv; } /** * 返回该类属性的键值对,键和值均为String类型 * @return * @throws illegalaccessexception * @throws IllegalArgumentException */ @JsONFIEld(serialize=false) public Map<String,Object> getMapValues() throws illegalaccessexception,IllegalArgumentException { return getFIEldValue(false); } @JsONFIEld(serialize=false) public voID savetoDataBase(String tablename,sqliteDatabase db) throws Exception{ if(getID()==0) throw new Exception("存储的_ID号码不能够是0,请稍后再试!"); Map<String,Object> maps=getFIEldValue(true); Set<String> keys=maps.keySet(); Object[] obJs=new Object[keys.size()]; String q=""; String sql="insert into "+tablename.trim()+"("; int i=0; for(String s:keys){ Object obj=maps.get(s); if(i!=0) { sql+=","; q+=","; } sql+=s; q+="?"; obJs[i]=obj; i++; } sql+=") values ("+q+")"; db.execsql(sql,obJs); } @JsONFIEld(serialize=false) public voID updatetoDataBase(String tablename,sqliteDatabase db) throws Exception{ if(getID()==0) throw new Exception("更新的_ID号码不能够是0,请稍后再试!"); this.updatetoDataBaseByColumn(tablename,db,primaryKeyname); } /** * * @param tablename * @param db * @param columnname 指定此此表的一个列名称,更新所有相同的记录 * @throws Exception */ @JsONFIEld(serialize=false) public voID updatetoDataBaseByColumn(String tablename,sqliteDatabase db,String columnname) throws Exception{ if(columnname==null) throw new Exception("更新的columnname不能够是null,Object> maps=getFIEldValue(true); Set<String> keys=maps.keySet(); Object[] obJs=new Object[keys.size()+1]; String sql="update "+tablename.trim()+" set "; int i=0; for(String s:keys){ Object obj=maps.get(s); if(i!=0) { sql+=","; } sql+=s+"=?"; obJs[i]=obj; if(s.equals(columnname)){ obJs[keys.size()]=obj; } i++; } sql=sql+" where "+columnname+"=?"; db.execsql(sql,obJs); //data.close(); } /** * * @param tablename * @param data * @param notUpdateColumns 不需要跟新的字段,区分大小写 * @throws Exception */ @JsONFIEld(serialize=false) public voID updatetoDataBase(String tablename,String[] notUpdateColumns) throws Exception{ if(getID()==0) throw new Exception("更新的_ID号码不能够是0,请稍后再试!"); Map<String,Object> maps=getFIEldValue(true); Set<String> keys=maps.keySet(); Object[] obJs; Map<String,Object> updateMap=new HashMap<String,Object>(); String sql="update "+tablename.trim()+" set "; int i=0; for(String s:keys){//筛选出来需要更新的数据 boolean need=true; if(notUpdateColumns!=null) for(String c:notUpdateColumns){ if(c.equals(s)) { need=false; break; } } if(need){ updateMap.put(s,maps.get(s)); } } Set<String> key=updateMap.keySet(); obJs=new Object[key.size()+1]; i=0; for(String s:key){ Object value=updateMap.get(s); if(i!=0) { sql+=","; } sql+=s+"=?"; obJs[i]=value; if(s.equals(primaryKeyname)) { obJs[key.size()]=value; } i++; } sql=sql+" where "+primaryKeyname+"=?"; db.execsql(sql,obJs); } @OverrIDe public boolean equals(Object o) { if(this.getClass().getname().equals(o.getClass().getname())&&this.getID()-((BaseEntity)o).getID()==0) return true; return super.equals(o); } @OverrIDe public int hashCode() { return getID().intValue(); } public abstract Long getID(); }
其中@H_301_63@Entity_FIEldProperty这个注解主要是帮助我们对对象和List进行存储以及读取,说白了就是简单的将之转化为Json字符串,然后进行相关的序列号与反序列化;
至于List嵌套和对象嵌套的反序列化,可以查看博文http://www.jb51.cc/article/p-rucngbxv-ph.html
/** * 指定当前Entity中的属性的属性,即自生的类别和转换的方式 * @author dvIEw76 * 当FIEldType.Base的时候,将会按照默认识别的类型使用,即此时的cls属性不会生效 * JsonList,JsonObject,Base,TransIEnt * JsonList,JsonObject表示此对象需要转换为一个Json对象或者字符串; * TransIEnt表示此对象,不进行数据库的存和取 *** 作,选择TransIEnt的时候,cls属性不会生效 */@Target(ElementType.FIELD)@Retention(RetentionPolicy.RUNTIME)public @interface Entity_FIEldProperty { /** * 指定一个类型是FIEldType的,表现为FIEldType=默认为FIEldType.Base的Annotation * @return */ FIEldType FIEldType() default FIEldType.Base; /** * 指定一个类型是Class的,表现为cls=默认为String.class的Annotation * @return */ Class cls() default String.class; /** * 指定当前属性的类型 * */ public enum FIEldType{ JsonList,TransIEnt; }; }
之后是主角BaseandroidDao,其实就是增删改查方法的封装:
约定如下:此dao中不会管理事务;
/** * Dao中不会管理事务,事务在Service层中进行管理 * @author dvIEw * */public class BaseandroidDao<T extends BaseEntity> { private String tablename; private DataBaseManager dbManager; public BaseandroidDao(String tablename) { super(); this.dbManager=DataBaseManager.getInstance(); this.tablename = tablename; } public sqliteDatabase openDataBase(){ return dbManager.openDatabase(); } public voID closeDataBase(){ dbManager.closeDatabase(); } /** * 得到当前的最大的ID号码的值 * @param db * @return */ public Long getMaxID(sqliteDatabase db){ Cursor c=null; c=this.getCursor(db,tablename,null,"select max("+T.primaryKeyname+") ",null); if(c.movetoNext()){ return c.getLong(c.getColumnIndex(T.primaryKeyname)); }else return null; } /** * 得到当前的最小的ID号码的值 * @param db * @return */ public Long getMinID(sqliteDatabase db){ Cursor c=null; c=this.getCursor(db,"select min("+T.primaryKeyname+") ",null); if(c.movetoNext()){ return c.getLong(0); }else return null; } /** * 得到当前的的记录总数 * @param db * @return */ public Long getCount(sqliteDatabase db){ Cursor c=null; c=this.getCursor(db,"select count(*) ",null); if(c.movetoNext()){ return c.getLong(0); }else return null; } /** * 返回所保存到数据库中的列表 * @param entity * @return */ protected List<String> getEntityColumnnameList(Class<?> cls){ List<String> List=new ArrayList<String>(); Class<?> clazz=cls; FIEld[] fs=clazz.getDeclaredFIElds(); String filedname=null; for(FIEld fIEld:fs){ fIEld.setAccessible(true); filedname=fIEld.getname(); Annotation[] as=fIEld.getAnnotations(); Class fclass=null; FIEldType fType=null; for(int i=0;i<as.length;i++){ Annotation a=as[i]; if(a instanceof Entity_FIEldProperty){ Entity_FIEldProperty ef=(Entity_FIEldProperty)a; if(ef!=null){ fclass=ef.cls(); fType=ef.FIEldType(); } break; } } if(fType==null||fType!=FIEldType.TransIEnt) List.add(filedname); } return List; } /* *得到除开指定名称的属性列 */ public String[] getEntityColumnnames(Class<?> cls,Boolean isRepacePrimaryKeyname,String... exceptCoulums){ List<String> nameList=getEntityColumnnameList(cls); if(isRepacePrimaryKeyname==null){ isRepacePrimaryKeyname=true; } if(exceptCoulums!=null){ for(String s:exceptCoulums){ nameList.remove(s); } } String[] names=new String[nameList.size()]; for(int i=0;i<nameList.size();i++){ names[i]=nameList.get(i); if(names[i].tolowerCase(Locale.ENGliSH).equals("ID")){ names[i]=BaseEntity.primaryKeyname; } } return names; } /**失败返回null * 传入代ID值的Entity的值实例 * @param t 返回t * @return * @throws Exception */ public T get(sqliteDatabase db,T t) throws Exception{ if(t==null) return null; Cursor c=null; try { c=this.getCursor(db,T.primaryKeyname+"=?",new String[]{t.getID()+""},null); if(c.movetoNext()) { t.initFromCursor(c); return t; }else{ return null; } } catch (Exception e) { Log.e(this.getClass().getname()+"T get:",e.toString()); throw e; }finally{ if(c!=null) c.close(); } } /**手动的条件搜索 * @return * @throws Exception */ public T get(sqliteDatabase db,Class<T> cls,String[] columns,String selection,String[] selectionArgs,String orderBy) throws Exception{ Cursor c=null; try { c=this.getCursor(db,columns,selection,selectionArgs,orderBy,"0,1"); if(c.movetoNext()) { T t=cls.newInstance(); t.initFromCursor(c); return t; }else{ return null; } } catch (Exception e) { Log.e(this.getClass().getname()+"T get:",e.toString()); throw e; }finally{ if(c!=null) c.close(); } } /**失败返回null * 传入代ID值的Entity的值实例 * @param t 返回t * @param exceptCoulums 不需要取出的数据列的名称 * @return * @throws Exception */ public T get(sqliteDatabase db,T t,String... exceptCoulums) throws Exception{ if(t==null) return null; Cursor c=null; try { String[] names=getEntityColumnnames(t.getClass(),true,exceptCoulums); c=this.getCursor(db,names,e.toString()); throw e; }finally{ if(c!=null) c.close(); } } /** * * 失败返回空数组 * @param db * @param cls * @param selection * @param selectionArgs * @param orderBy * @param limit select * from table_name limit N,M //N序号从0开始 * @param exceptCoulums 指定不从数据库取出的列 * @return * @throws Exception */ public List<T> getList(sqliteDatabase db,String orderBy,String limit,String... exceptCoulums) throws Exception{ List<T> ts=new ArrayList<T>(); Cursor c = null; try { String[] names=getEntityColumnnames(cls,exceptCoulums); c=this.getCursor(db,limit); while(c.movetoNext()){ T t=cls.newInstance(); t.initFromCursor(c); if(!ts.contains(t)) ts.add(t); } } catch (Exception e) { Log.e("getList:"+cls.getname(),e.toString()); throw e; }finally{ if(c!=null) c.close(); } return ts; } /** * 失败返回空数组 * @param db * @param cls *@param selection * @param selectionArgs * @param orderBy * @param limit select * from table_name limit N,M //N序号从0开始 * @return * @throws Exception */ public List<T> getList(sqliteDatabase db,String limit) throws Exception{ List<T> ts=new ArrayList<T>(); Cursor c = null; try { c=this.getCursor(db,e.toString()); throw e; }finally{ if(c!=null) c.close(); } return ts; } /** * 获取数据库中的所有的记录 * @param db * @param cls * @return * @throws Exception */ public List<T> getList(sqliteDatabase db,Class<T> cls) throws Exception{ List<T> ts=new ArrayList<T>(); Cursor c = null; try { c=this.getCursor(db,null); while(c.movetoNext()){ T t=cls.newInstance(); t.initFromCursor(c); if(!ts.contains(t)) ts.add(t); } } catch (Exception e) { Log.e("getList:"+cls.getname(),e.toString()); throw e; }finally{ if(c!=null) c.close(); } return ts; } /** * * @param t * @return 插入返回1 * @throws Exception */ public voID saveOrUpdate(sqliteDatabase db,T t) throws Exception{ Cursor c = null; try { c=this.getCursor(db,null); if(c.movetoNext()) {//如果已经存在,则更新,否则insert t.updatetoDataBase(tablename,db); return; } t.savetoDataBase(tablename,db); return; } catch (Exception e) { Log.e("saveOrUpdate:"+t.getClass().getname(),e.toString()); throw e; }finally{ if(c!=null) c.close(); } } /** * * @param t * @return 插入返回1 * @param columnname 如果指定的字段,有相同的值存在于数据库,那么就更新数据库,否则保存 * @throws Exception */ public voID saveOrUpdate(sqliteDatabase db,String columnname) throws Exception{ Cursor c = null; try { c=this.getCursor(db,columnname+"=?",new String[]{t.getClass().getFIEld(columnname).get(t)+""},否则insert t.updatetoDataBaseByColumn(tablename,columnname); return; } t.savetoDataBase(tablename,e.toString()); throw e; }finally{ if(c!=null) c.close(); } } /** * 先删除,后保存,没有则不删除 * @param db * @param t * @throws Exception */ public voID deleteAndSave(sqliteDatabase db,T t) throws Exception{ try { this.delete(db,t.getID()+""); this.save(db,t); } catch (Exception e) { Log.e("saveOrUpdate:"+t.getClass().getname(),e.toString()); throw e; } } /** * * @param db * @param List * @return * @throws Exception */ public voID saveOrUpdateList(sqliteDatabase db,List<T> List) throws Exception{ try{ for(T t:List){ saveOrUpdate(db,t); } }catch(Exception e){ throw new Exception("saveOrUpdateList: "+" Fail"); } } /** * * @param db * @param List * @param column 指定列的值相同就更新,否则就保存 * @throws Exception */ public voID saveOrUpdateList(sqliteDatabase db,List<T> List,String column) throws Exception{ try{ for(T t:List){ saveOrUpdate(db,t,column); } }catch(Exception e){ throw new Exception("saveOrUpdateList: "+" Fail"); } } /** *删除后保存所有 * @param db * @param List * @return * @throws Exception */ public voID deleteAndSaveList(sqliteDatabase db,List<T> List) throws Exception{ try{ for(T t:List){ deleteAndSave(db,t); } }catch(Exception e){ throw new Exception("saveOrUpdateList: "+" Fail"); } } public int update(sqliteDatabase db,T t) throws Exception{ try { t.updatetoDataBase(tablename,db); return 2; } catch (Exception e) { Log.e("update:"+t.getClass().getname(),e.toString()); throw e; } } /** * * @param t * @param notUpdateColumns 不需要更新的字段名称的数组 * @return * @throws Exception */ public int update(sqliteDatabase db,String[] notUpdateColumns) throws Exception{ try { t.updatetoDataBase(tablename,notUpdateColumns); return 2; } catch (Exception e) { Log.e("update:"+t.getClass().getname(),e.toString()); throw e; } } public int save(sqliteDatabase db,T t) throws Exception{ try { t.savetoDataBase(tablename,db); return 1; } catch (Exception e) { Log.e("save:"+t.getClass().getname(),e.toString()); throw e; } } public int delete(sqliteDatabase db,String ID) throws Exception{ if(ID.equals("0")) throw new Exception("删除的_ID号码不能够是0,请稍后再试!"); try { this.delete(db,ID); return 1; } catch (Exception e) { Log.e("delete:"+this.getClass().getname(),e.toString()); throw e; } } public int deleteList(sqliteDatabase db,String IDs) throws Exception{ try { String whereClause=" "+T.primaryKeyname+" in (?)"; String[] whereArgs=new String[]{IDs}; this.delete(db,whereClause,whereArgs); return 1; } catch (Exception e) { Log.e("deleteList:"+this.getClass().getname(),e.toString()); throw e; } } public int deleteall(sqliteDatabase db) throws Exception{ try { this.delete(db,null); return 1; } catch (Exception e) { Log.e("deleteall:"+this.getClass().getname(),e.toString()); throw e; } } /** * 返回搜索的cursor; * @param db * @param sqlString * @param selectionArgs sql中?占位符的参数 * @return */ public Cursor getCursor(sqliteDatabase db,String sqlString,String[] selectionArgs){ return db.rawquery(sqlString,selectionArgs); } /** * * @param db * @param sqlString * @param selectionArgs sql中?占位符的参数 * @param columns 需要出去的列的名称,没有会赋值null;取出的列只支持float/string/blob/string/null这几种类型; * *其中二进制会转换成为byte[]类型;除开这些类型外,系统会默认用string来取出数据 * @return List<Object[]> */ public List<Object[]> getColumns(sqliteDatabase db,String...columns){ List<Object[]> List=new ArrayList<Object[]>(); Object[] obJs=null; Cursor cursor=getCursor(db,sqlString,selectionArgs); while(cursor.movetoNext()){ obJs=new Object[columns.length]; try{ for(int i=0;i<columns.length;i++){ String ss=columns[i]; int index=cursor.getColumnIndex(ss); if(index==-1) continue; int columnType =cursor.getType(index); switch (columnType) { case Cursor.FIELD_TYPE_NulL: obJs[i]=null; break; case Cursor.FIELD_TYPE_INTEGER: obJs[i]=cursor.getInt(index); break; case Cursor.FIELD_TYPE_BLOB: obJs[i]=cursor.getBlob(index); break; case Cursor.FIELD_TYPE_float: obJs[i]=cursor.getfloat(index); break; case Cursor.FIELD_TYPE_STRING: obJs[i]=cursor.getString(index); break; default: obJs[i]=cursor.getString(index); break; } } List.add(obJs); }catch(ClassCastException e){ e.printstacktrace(); Log.e("BaseandroidDao:getColumns:",e.toString()); } } return List; } public Cursor getCursor(sqliteDatabase db,String table,String groupBy,String having,String limit) { Cursor cursor = db.query(table,groupBy,having,limit); return cursor; } public voID execsql(sqliteDatabase db,String sql){ db.execsql(sql); } public voID execsql(sqliteDatabase db,String sql,Object[] obJs){ db.execsql(sql,obJs); } /** * 调用原生的insert方法,不推荐 * @param tablename * @param cv * @return */ public long insert(sqliteDatabase db,String tablename,ContentValues cv) { long row = db.insert(tablename,cv); return row; } /** * 调用自己写的方法,insert into person(name,phone) values (?,?) * @param p */ public voID save(sqliteDatabase db,Object[] obJs) { db.execsql(sql,obJs); } public voID update(sqliteDatabase db,Object[] obJs){ db.execsql(sql,obJs); } //删除 *** 作 public voID delete(sqliteDatabase db,String ID) { String where =BaseEntity.primaryKeyname + "=?"; String[] whereValue ={ID}; db.delete(tablename,where,whereValue); } //删除 *** 作 public voID delete(sqliteDatabase db,String whereClause,String[] whereArgs) { db.delete(table,whereArgs); } //修改 *** 作 public voID update(sqliteDatabase db,int ID,ContentValues cv) { String where = BaseEntity.primaryKeyname+ "=?"; String[] whereValue = { Integer.toString(ID) }; db.update(tablename,cv,whereValue); } //修改 *** 作 public voID update(sqliteDatabase db,ContentValues cv,String where,String[] whereValue) { db.update(tablename,whereValue); } public String gettablename() { return tablename; } public voID settablename(String tablename) { this.tablename = tablename; } }
public class LoginTypeService {private String tablename="loginType";private BaseandroidDao<LoginType> baseDao; public LoginTypeService(){ baseDao=new BaseandroidDao<LoginType>(tablename); } public LoginType getLoginType(){ LoginType lt=new LoginType(); lt.setID(1L); sqliteDatabase db = null; try { db=baseDao.openDataBase(); lt=baseDao.get(db,lt); return lt; } catch (Exception e) { return null; }finally{ baseDao.closeDataBase(); } } public boolean saveOrUpdate(LoginType loginType){ if(loginType==null||loginType.getID()==null) return false; sqliteDatabase db = null; try { db=baseDao.openDataBase(); db.beginTransaction(); baseDao.saveOrUpdate(db,loginType); db.setTransactionSuccessful(); return true; } catch (Exception e) { return false; }finally{ if(db!=null) db.endTransaction(); baseDao.closeDataBase(); } } }
注意:Service层,就是是控制层来负责事务的管理; 总结
以上是内存溢出为你收集整理的利用反射实现对sqlite3数据库的crud(增删改查) *** 作的一个baseAndroidDao封装,安卓开发中全部内容,希望文章能够帮你解决利用反射实现对sqlite3数据库的crud(增删改查) *** 作的一个baseAndroidDao封装,安卓开发中所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)