借鉴前辈的知识完善了一下关于Android在apk更新的时候数据库改变的(只限于在数据库末尾添加新字段)
@Override
public void onUpgrade(SQLiteDatabase _db, int oldVersion, int newVersion) {
// 函数在数据库需要升级时被调用,
// 一般用来删除旧的数据库表,
// 并将数据转移到新版本的数据库表中
/**
* 要在方法里写for循环,主要是考虑到夸版本升级, 比如有的用户一直不升级版本,数据库版本号一直是1,
* 而客户端最新版本其实对应的数据库版本已经是4了, 那么我中途可能对数据库做了很多修改,通过这个for循环,可以迭代升级,不会发生错误。
*/
for (int j = oldVersion + 1; j <= newVersion; j++) {
switch (j) {
case 2:
addColumn(_db, new String[] { SqlVisitBean.STARTTIME, SqlVisitBean.ENDTIME }, "DB_Visit_Info");
break;
case 3:
addColumn(_db, new String[] { "temp" }, "DB_Visit_Info");
break;
default:
break;
}
}
}
/**
* 在表中添加字段方法 操作步骤: 1、先更改表名 2、创建新表,表名为原来的表名 3、复制数据 4、删除旧表
*
* @param db
* 数据库名
* @param newColumnArr
* 添加的新字段的表名数组
* @param oldTableName
* 旧表名,在方法内部将旧表名修改为 _temp_+oldTableName
*/
private void addColumn(SQLiteDatabase db, String[] newColumnArr, String oldTableName) {
if (db == null || newColumnArr == null || newColumnArr.length < 1 || TextUtils.isEmpty(oldTableName)) {
// 数据库为空,新字段个数为0,添加字段后的字段数组个数为0,旧表名为空
return;
}
// 拿到旧表中所有的数据
Cursor cursor = db.rawQuery("select * from " + oldTableName, null);
if (cursor == null) {
// 如果游标为空
return;
}
// 拿到原来的表中所有的字段名
String[] oldColumnNames = cursor.getColumnNames();
// 更改原表名为临时表
String tempTableName = "temp_" + oldTableName;
db.execSQL("alter table " + oldTableName + " rename to " + tempTableName);
// 创建新表
if (oldColumnNames.length < 1) {
// 如果原来的表中字段个数为0
return;
}
// 创建一个线程安全的字符串缓冲对象,防止用conn多线程访问数据库时造成线程安全问题
StringBuffer createNewTableStr = new StringBuffer();
createNewTableStr.append("create table if not exists " + oldTableName + "(");
for (int i = 0; i < oldColumnNames.length; i++) {
if (i == 0) {
createNewTableStr.append(oldColumnNames[i] + " integer primary key autoincrement,");
} else {
createNewTableStr.append(oldColumnNames[i] + ",");
}
}
for (int i = 0; i < newColumnArr.length; i++) {
if (i == newColumnArr.length - 1) {
// 最后一个
createNewTableStr.append(newColumnArr[i] + ")");
} else {
// 不是最后一个
createNewTableStr.append(newColumnArr[i] + ",");
}
}
db.execSQL(createNewTableStr.toString());
// 复制旧表数据到新表
StringBuffer copySQLStr = new StringBuffer();
copySQLStr.append("insert into " + oldTableName + " select *,");
// 有多少个新的字段,就要预留多少个' '空值给新字段
for (int i = 0; i < newColumnArr.length; i++) {
if (i == newColumnArr.length - 1) {
// 最后一个
copySQLStr.append("' ' from " + tempTableName);
} else {
// 不是最后一个
copySQLStr.append("' ',");
}
}
db.execSQL(copySQLStr.toString());
// 删除旧表
db.execSQL("drop table if exists " + tempTableName);
// 关闭游标
cursor.close();
}
暂时就是这些
感谢http://blog.youkuaiyun.com/sunnyjerry/article/details/54091345