一.概况
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); } }