Android数据库更新

最近在写一个android开发框架的时候用到了ormlite,也稍微封装了一下。但是如果已经存在一个数据库,我要在其中一个表中插入某一列可怎么办呢?不止如此,我想删除某一列,修改某一列的数据类型,修改某个表的名字,这些需求在数据库需要经常修改字段的时候经常用到。而google一下发现其实数据库的一些语句其实是可以做到的,就是alter。
下面贴上相关代码片段:

/**
	* 更新升级数据库,包括删除,添加列,修改列的数据类型,修改表的名字
	* @author admin
	* @date 2015-10-22 上午11:07:57
	* @param updateType 要更新的类型 , 直接查看这个类的public静态变量
	* @param tableName 要添加表的名字
	* @param columnName 要添加列的名字
	* @param dataType 所属字段的数据类型"String" , "Integer" , "Boolean"
 */
public void addColumn(String tableName ,String columnName , String dataType){
	String tempDataType = null;
	String defaultValue = null;
	if(!StringUtil.isEmpty(tableName, columnName) && dataType != null){
		if(dataType.equals("String")){
			tempDataType = "String";
			defaultValue = null;
		}else if(dataType.equals("Integer")){
			tempDataType = "Integer";
			defaultValue = "0";
		}else if(dataType.equals("Boolean")){
			tempDataType = "Boolean";
			defaultValue = "0";
		}
	}
	if(!StringUtil.isEmpty(tempDataType)){
		getWritableDatabase().execSQL("alter table " + tableName + " add " + columnName + " " + tempDataType + " default " + defaultValue);			
	}
}
	
/**
	* 删除表中的某一列
	* 
	* @author admin
	* @date 2015-10-22 下午4:00:41
	* @param tableName
	* @param columnName
*/
public void deleteColumn(String tableName , String columnName){
	if(!StringUtil.isEmpty(tableName, columnName)){
		getWritableDatabase().execSQL("alter table " + tableName + " drop column " + columnName);
	}		
}
/**
	* 修改表中某一列的数据类型
	* 
	* @author admin
	* @date 2015-10-22 下午4:00:58
	* @param tableName
	* @param columnName
	* @param tempDataType
*/
public void changeColumnType(String tableName , String columnName , String tempDataType){
	if(!StringUtil.isEmpty(tableName) && !StringUtil.isEmpty(columnName, tempDataType)){
		getWritableDatabase().execSQL("alter table " + tableName + " modify " + columnName + " " + tempDataType);
	}		
}
	
/**
	* 修改某个表的名字
	* 
	* @author admin
	* @date 2015-10-22 下午4:01:15
	* @param oldTableName
	* @param newTableName
*/
public void changeTableName(String oldTableName , String newTableName){
	if(!StringUtil.isEmpty(oldTableName, newTableName)){
		getWritableDatabase().execSQL("alter table " + oldTableName + " rename to " + newTableName);
	}
}

这一部分的代码放在DatabaseHelper里面,这个类继承自Ormlite的OrmLiteSqliteOpenHelper类。下面展示如何调用:

try {
	DataTestDaoImpl daoImpl = new DataTestDaoImpl(this);
	daoImpl.addColumn("data_test", "qin", "String");
	DataTest test = new DataTest();
	test.setId("126");
	test.setDate("" + new Date());
	test.setTime("" + new Date());
	test.setName("chuck chan");
	test.setQin("yan");
	
	Transaction trans = daoImpl.getTransaction();
	trans.begainTransaction();
	daoImpl.saveOrUpdate(test);
	trans.commit();
	trans.endTransaction();
} catch (Exception e) {
	e.printStackTrace();
}

其中DataTestDaoImpl主要用来操作DataTest这张表,所有这张表的操作都会在这里类里面实现,具体代码如下:

public class DataTestDaoImpl extends DaoImpl<DataTest, String>{
	private Context mContext;
	public DataTestDaoImpl(Context context){
		super(DataTest.class , MyDatabaseHelper.getInstance(context));
		mContext = context;
	}
	
	public void addColumn(String tableName ,String columnName , String dataType){
		MyDatabaseHelper.getInstance(mContext).addColumn(tableName, columnName, dataType);
	}
}

表的相关操作与添加column类似。另外需要在添加了相关字段之后才能添加或者更新相关数据,不然的话报错出异常。对于大数据量或者多个表的操作要开启事务处理,提高操作效率。

你可能感兴趣的:(Android)