利用反射实现对sqlite3数据库的crud(增删改查) *** 作的一个baseAndroidDao封装,安卓开发中

利用反射实现对sqlite3数据库的crud(增删改查) *** 作的一个baseAndroidDao封装,安卓开发中,第1张

概述1.说明 博主主要是做java web后台这一块,但是偶尔做点安卓,发现安卓上没有像Hibernate这种orm框架(....其实也没有去找), 又觉得每次增删改查都自己写代码的话肯定是非常麻烦的,所以就写了一个简单的baseAndroidDao来封装一些简单的增删改查 *** 作; 需要注意的是,此框架并非一个健全的orm框架,功能简单,而且这些功能必须采用博主约定的方式才能正确运行; 2.具体实现 例 1.说明

博主主要是做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;		}			}


这里DataBaseManager实际上是一个管理数据库连接的类,不需要的可以忽略,详情见: http://www.jb51.cc/article/p-gqomqzzh-ph.html


3:使用示例:

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封装,安卓开发中所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/1168493.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-01
下一篇 2022-06-01

发表评论

登录后才能评论

评论列表(0条)

保存