一.概况
SQLite数据库的数据升级与降级的问题主要是要关注SQLiteOpenHelper这一个抽象的类
(ps:SQLiteOpenHelper类具体的介绍,请浏览本人的前一章博客,链接:http://www.cnblogs.com/zhaoyucong/p/6113911.html)
主要的三个方法:
onCreate()该方法是在你没有安装过(第一次运行)的时候执行,这时可以在这个函数中完成初始的数据表的创建
onUpgrade()该方法是在你安装过的情况下,对数据继续更新的时候执行,这时可以在这个函数完成数据库版本升级带来的旧版本的兼容问题,以及数据迁移问题。
onDowngrade()该方法是在现逆向降级(如应用由版本号4降级安装版本号为3的包)时必须重写的方法,如果应用降级覆盖安装时没有重写该方法则会崩溃。
二.例子(主要呈现的是不管用户对使用的版本是(升级/降级/重新安装)的情况下,我们数据库的数据仍然保存着一致的)
版本1.0初始化的代码如下:
public class MyDatabaseOpenHelper extends SQLiteOpenHelper {
private static final String db_name = "mydata.db"; // 数据库名称
private static final int version = 1; // 数据库版本
public MyDatabaseOpenHelper(Context context) {
super(context, db_name, null, version);
}
//该方法第一次运行才会执行
public void onCreate(SQLiteDatabase db) {
//没有数据库打印日记
//这里必须要写好最早的版本-现在版本的建表,要考虑还没有装过旧版本(直接安装最新版本)的用户的情况
Log.i("Log","第一次运行,没有数据库,生成数据库");
//建表语句
String sql_message = "create table t_message (id int primary key,userName varchar(50),lastMessage varchar(50),datetime varchar(50))";
//执行建表语句
db.execSQL(sql_message);
}
//数据库存更新才会执行
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
Log.i("updateLog","数据库更新了!");
}
}
调用代码如下:
public class MainActivity extends Activity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
MyDatabaseOpenHelper helper = new MyDatabaseOpenHelper(MainActivity.this);
helper.getWritableDatabase().close();
}
}
升级版本为2.0(为创建的表添加内容)
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
//判断用户当前安装的本是不是1.0版本
if(oldVersion == 1){
String sql_init_1 = "insert into t_message values (1,'小明','内容1','昨天')";
String sql_init_2 = "insert into t_message values (2,'小红','内容2','今天')";
db.execSQL(sql_init_1);
db.execSQL(sql_init_2);
Log.i("Log", "从1.0升级到2.0,升级成功!");
}
//如果还有更老的版本就继续判断,维护版本兼容性
}
降级版本1.0
public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) {
try {
//第一、先把t_message 未来的表,改名
String rename_sql = "alter table t_message rename to t_message_bak";
db.execSQL(rename_sql);
Log.i("down", "1.改名成功");
//第二、建立1.0的表结构
String sql_message = "create table t_message (id int primary key,userName varchar(50),lastMessage varchar(50),datetime varchar(50))";
db.execSQL(sql_message);
Log.i("down", "2.建立1.0表结构成功");
//第三、把备份的数据,copy到 新建的1.0的表
String sql_copy = "insert into t_message select id,userName,lastMessage,datetime from t_message_bak";
db.execSQL(sql_copy);
Log.i("down", "3.copy到用户数据到 1.0的表");
//第四、把备份表drop掉
String drop_sql = "drop table if exists t_message_bak";
db.execSQL(drop_sql);
Log.i("down", "4.把备份表drop掉");
} catch (Exception e) {
//失败
Log.i("Log", "降级失败,重新创建");
String sql_drop_old_table = "drop table if exists t_message";
String sql_message = "create table t_message (id int primary key,userName varchar(50),lastMessage varchar(50),datetime varchar(50))";
String sql_init_1 = "insert into t_message values (1,'小明','内容1','昨天')";
String sql_init_2 = "insert into t_message values (2,'小红','内容2','今天')";
db.execSQL(sql_drop_old_table);
db.execSQL(sql_message);
db.execSQL(sql_init_1);
db.execSQL(sql_init_2);
}
}
转载于:https://www.cnblogs.com/zhaoyucong/p/6118226.html