Android SQLite数据库的数据升级与降级

一.概况

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