数据库版本升级
在开发android应用程序的时候,一般由于在我们开发的时候我们不知道以后会后什么新功能,也有可能增加业务逻辑(也就是更新),可想而知我们原来的数据库结构可能不适用已更新的应用,那么应用在读取旧数据的时候可能就会出现问题;解决上面问题的方法有如下两种:
1.卸载旧版本,安装新的应用程序
备注:这样做有一点不好就是原来的数据就丢失了;
@Override
2 public void onUpgrade(SQLiteDatabase db, int oldVersion, int oldVersion) {
3 if(oldVersion!=oldVersion){
dropAll(db);
//在重新创建新的数据库就可以了
createTables();具体的实现自己实现
}
7 }
2.软件自行更新数据库结构(接下来就介绍软件自行更新方法)
首先我们新建一个项目并初始化数据库(此时数据库版本为1.0)
public class myDatabase extends SQLiteOpenHelper{
11
12 public static final String CREATE_BOOK = "***.***.db";
public static final String ALT_SMS_TABLE ="alter table sms rename to sms_tmp";
public static final String DROP_SMS_TEMP ="DROP TABLE IF EXISTS sms_tmp";
public static final String SMS_TEMP = "sms_tmp";
public static final String SMS = "sms";
public static final String
18
19 private Context mContext;
20
21
22 public myDatabase(Context context) {
23 super(context, CREATE_BOOK, null, 1); //数据库版本为1
24 mContext = context;
25 }
26
27
28 /*数据库第一次创建时调用,适合用于初始化,创建表 当数据库已存在则不调用该方法*/
29 @Override
30 public void onCreate(SQLiteDatabase db) {
31 db.execSQL(CREATE_BOOK);
35 }
36
37 @Override
38 public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
39 //
db.beginTarnsaction();
db.execSQL(ALT_SMS_TABLE);
createSmsTables(db);
//拷贝备份的到新的表中
copySmsTable(db);
//删除备份表中
db.execSQL(DROP_SMS_TEMP);
db.endTransaction();
40 }
41
42 }
拷贝数据到新的表中方法:
private void copySmsTable(SQLiteDatebase db){
Cursor sms = db.rawQuery("PRAGMA table_info("+SMS_TMP+"),null");
if(sms!=null&&sms.getCount!=0){
String[]columnNames = new String[sms.getCount()];
int columnIndex = sms.getColumnIndex("name");
if(columnIndex==-1){
return;
}
int index = 0;
for(sms.moveToFirst();!sms.isAfterLast();sms.moveToNext()){
columnNames[index] = sms.getString(columnIndex);
index++;
}
String columns = Arrays.toString(columnNames);
columns = columns.substring(1,columns.length()-1);
String sql = "INSERT INTO"+SMS+"("+columns+")"+"SELECT"+columns+"FROM"+SMS_TMP;
db.execSQL(sql);
sms.close();
}
}
降级的设计关键点
@Override
2 public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) {
//这个方法必须实现 不然后面不能再降级
//哪怕这个方法里面没有实现,可以后面需要的话,再继续实现
}
参考链接 在此特别鸣谢:
https://blog.csdn.net/leehong2005/article/details/9128501s
https://www.cnblogs.com/wenjiang/p/4557196.html