• 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);
            }
        }
  • 相关阅读:
    nginx下根据指定路由重定向
    Ubuntu下配置apache开启https
    php+websocket搭建简易聊天室实践
    rsync + git发布项目
    nginx下配置Yii2 rewrite、pathinfo等
    新装NGINX重启,出现错误 nginx: [error] open() "/usr/local/nginx/logs/nginx.pid"
    wamp mysql服务意外停止
    PHP异步请求
    php curl_errno 60
    php开启fileinfo扩展
  • 原文地址:https://www.cnblogs.com/zhaoyucong/p/6118226.html
Copyright © 2020-2023  润新知