zoukankan      html  css  js  c++  java
  • 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);
            }
        }
  • 相关阅读:
    webpack基础
    LeetCode232. 用栈实现队列做题笔记
    mysql 时间加减一个月
    leetcode 1381. 设计一个支持增量操作的栈 思路与算法
    LeetCode 141. 环形链表 做题笔记
    leetcode 707. 设计链表 做题笔记
    leetcode 876. 链表的中间结点 做题笔记
    leetcode 143. 重排链表 做题笔记
    leetcode 1365. 有多少小于当前数字的数字 做题笔记
    LeetCode1360. 日期之间隔几天 做题笔记
  • 原文地址:https://www.cnblogs.com/zhaoyucong/p/6118226.html
Copyright © 2011-2022 走看看