一、升级(使用到onUpgrade()方法和onCreate()没有安装过才用到)

简单理一下思路:

 v1.0 (也就是说第一次使用这软件,没有安装过 所有在onCreate() 方法里写代码)
  1.没有安装过    onCreate() 

--------------------------------------
v2.0   [onUpgrade 情况:n-1,onCreate 情况:1]  (这是第二个版本,有两种可能的升级路线,第一条是从版本1到版本2,第二种是第一次安装【也相当于一次性从版本1到2】)
  1.v1.0 --> v2.0    onUpgrade 
  2.没有安装过       onCreate() 
-----------------------------------------
v3.0   [onUpgrade 情况:n-1,onCreate 情况:1] ( 同理升级第三版本。。。。。。)
  1. v1.0 -->v3.0    onUpgrade 
     alter table t_message add column isdel bit default 0;
     插入数据
*  2. v2.0 -->v3.0    onUpgrade  
       alter table t_message add column isdel bit default 0;
  3. 没有安装过       onCreate()  
-----------------------------------------
 
首先创建一个类MyDatabaseOpenHelper继承SQLiteOpenHelper并实现方法
 
先创建第一个版本的数据库(数据库名是mydata.db,版本是1)

因为是第一次所以在onCreate 里写添加表的代码(表名sql_message,有五列)

最后运行,然后在ddms里面的data分区下的data文件夹中找到生成的mydata.db数据库文件拷贝到d盘,如图

然后启动dos命令对mydata.db进行操作看能否查到我们刚刚添加的表

找到了 也相当于第一个版本只有表还没有添加数据 现在我们正式升级到2.0 也就是添加几条数据

那么根据前面的逻辑思路 我们是从1.0到2.0,所以需要在onUpgrade()方法里进行升级,代码如下:

先把版本改为2(也就是说新版本号是2,老版本是1)

升级(在 onUpgrade编写)

public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

//判断老版本是不是等于1(是的现在我们升级到2)
if (oldVersion == 1) {

//我表里添加三条数据
String sql_init_1 = "insert into t_message values (1,'abc','abc1','abcd1','hi1')";
String sql_init_2 = "insert into t_message values (2,'abc','abc2','abcd2','hi1')";
String sql_init_3 = "insert into t_message values (3,'abc','abc2','abcd2','hi1')";
db.execSQL(sql_init_1);
db.execSQL(sql_init_2);
db.execSQL(sql_init_3);
Log.i("db", "从1到2,升级成功!");  //提示语
}
}

最后运行然后又拿到mydata.db又在dos查询看

那如果用户从来没有安装过,第一次安装2.0版本(记住是1.0到2.0了哦) 就要在onCreate 里面写上创建表的代码和添加数据的代码 两个都要写哦,

public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
// 编写【从0开始到最新状态】建表语句
Log.i("hi", "没有数据库,创建数据库,创建v2.0成功");
String sql_message = "create table t_message " +"(id int primary key,tou1 varchar(50),userName varchar(50)," +"lastMessage varchar(50),datetime varchar(50))";   //创建表
String sql_init_1 = "insert into t_message values (1,'abc','abc1','abcd1','hi1')";   //添加数据
String sql_init_2 = "insert into t_message values (2,'abc','abc2','abcd2','hi1')";
String sql_init_3 = "insert into t_message values (3,'abc','abc2','abcd2','hi1')";
db.execSQL(sql_message);  //先执行创建表,再添加数据
db.execSQL(sql_init_1);
db.execSQL(sql_init_2);
db.execSQL(sql_init_3);
}

以此类推  如果要升级到好多版本的话就只需要在onUpgrade里判断老版本号来编写升级所改动的表结构 最后执行数据库操作,升级无非是对数据表的结构发生改变而已 来改变用户需求达到升级的

二、降级(onDowngrade()方法)

降级的设计关键点
1、考虑云端要保存用户【自定义数据、行为习惯】。专业术语profile-->>提高用户黏度
2、考虑[当前]的最低版本要求-->>降低维护成本
3、尽可能本地的数据转移(所有新版本,都不删除字段)-->尽可能把未知变已知
代码需要try catch来包住 防止降级失败

我们这里用到也是上面升级到3.0的版本,就是说将在2.0基础上添加多一列的3.0降回到2.0  上面我们没讲2.0如何升级到3.0(简单说就是多加一列)  现在有降到2.0

那么我们首先要保证我们的mydata.db是3.0的版本

版本改为2.0

在onDowngrade方法里写降级代码:

public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) {
//正常来讲大于2.0的,应该有t_message 这张表,且2.0有的字段,3.0都有
try {
//第一、先把t_message 未来的表,改名
String rename_sql = "alter table t_message rename to t_message_bak";
db.execSQL(rename_sql);
Log.i("down", "1.改名成功");
//第二、建立2.0的表结构
String sql_message = "create table t_message (id int primary key,tou1 varchar(50),userName varchar(50),lastMessage varchar(50),datetime varchar(50))";
db.execSQL(sql_message);
Log.i("down", "2.建立2.0表结构成功");
//第三、把备份的数据,copy到 新建的2.0的表
String sql_copy = "insert into t_message select id,tou1,userName,lastMessage,datetime from t_message_bak";
db.execSQL(sql_copy);
Log.i("down", "3.copy到用户数据到 2.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("hi", "降级失败,重新建立");
String sql_drop_old_table = "drop table if exists t_message";
String sql_message = "create table t_message (id int primary key,tou1 varchar(50),userName varchar(50),lastMessage varchar(50),datetime varchar(50))";
String sql_init_1 = "insert into t_message values (1,'abc','abc1','abcd1','hi1')";
String sql_init_2 = "insert into t_message values (2,'abc','abc2','abcd2','hi1')";
String sql_init_3 = "insert into t_message values (3,'abc','abc2','abcd2','hi1')";
db.execSQL(sql_drop_old_table);
db.execSQL(sql_message);
db.execSQL(sql_init_1);
db.execSQL(sql_init_2);
db.execSQL(sql_init_3);
}
}

  

安卓在SQLiteOpenHelper类进行版本升级和降级的更多相关文章

  1. Android_SQLite版本升级,降级 管理

    今天我们主要学习了数据库版本升级对软件的管理操作. 我们手机经常会收到xxx软件升级什么的提醒,你的软件版本更新,同时你的数据库对应的版本也要相应的更新. 数据库版本更新需要主要的问题: 软件的1.0 ...

  2. Android:SQLiteOpenHelper类(SQLlite数据库操作)详细解析

    前言 SQLite数据库操作在Android开发中非常常用 今天我将带大家全面了解关于SQLite数据库的操作(增.删.查.改) 目录 1. SQLite数据库介绍 SQLite是Android内置的 ...

  3. Android笔记——SQLiteOpenHelper类

    public 抽象类 SQLiteOpenHelper 继承关系 Java.lang.Object android.database.sqlite.SQLiteOpenHelper 类概要 这是一个辅 ...

  4. Android中SQLiteOpenHelper类的onUpgrade方法浅谈

    public abstract void onUpgrade(SQLiteDatabase db,int oldVersion,int new Version) 这个方法在实现时需要重写. onUpg ...

  5. Android SQLiteOpenHelper类的使用

    SQLiteOpenHelper类是Android平台提供的用于SQLite数据库的创建.打开以及版本管理的帮助类.一般需要继承并这个类并实现它的onCreate和onUpgrade方法,在构造方法中 ...

  6. android SQLite使用SQLiteOpenHelper类对数据库进行操作

    android SQLite使用SQLiteOpenHelper类对数据库进行操作 原文: http://byandby.iteye.com/blog/835580

  7. Android之ListView动态添加数据(SQLiteOpenHelper类添加数据)

    一.SQLiteOpenHelper类: 这次我们通过sqlite来动态添加数据,接下来我们创建一个openHelper.java,在前面sqlite博客中我们已经详细的讲了SQLite的创建及使用等 ...

  8. Android中SQLite数据库操作(2)——SQLiteOpenHelper类

    如果开发者对SQL语法不熟悉,我要告诉你一个好消息,Android提供了一个SQLiteOpenHelper类. 在实际项目中很少使用SQLiteDatabase的方法(请看:http://blog. ...

  9. SQLiteOpenHelper类

    SQLiteOpenHelper是管理数据库的工具类. 下面提供一个模板: package com.example.intelligencecontrol.utils; import android. ...

随机推荐

  1. DGV属性

    1.控件的SelectedCells.Count属性可以判断用户是否已经选择数据,如果大于0说明有选择的数据. 2.SelectedCells[N].Value的属性可以获取某一行数据中某列的数据,其 ...

  2. mysql更新密码为空

    1.进入命令行 mysql -u root -p 'oldpassword'; 2 修改root用户的密码:mysql> update mysql.user set password=PASSW ...

  3. 脚本学习python和linux-shell和jQuery(javascript)

    使用脚本可以方便管理,使用计算机. 打算学脚本来更好地用计算机系统,特别是Linux. 学python因为它开源,而且是C家族的语言,本来也是课程需要,再加上它确实很好,所以非常主打,之前看过perl ...

  4. extern "C" {} 来沟通C和C++

    比如说你用C++开发了一个DLL库,为了能够让C语言也能够调用你的DLL输出(Export)的函数,你需要用extern "C"来强制编译器不要修改你的函数名. 通常,在C语言的头 ...

  5. 实例:用jQuery实现垂直和水平下拉 菜单

    主要是利用jQuery来实现垂直菜单和水平菜单.实现效果如图: 第一步,创建一个HTML文件,如图,包含两个ul.当然把jquery库也引入进去了. <!DOCTYPE html> < ...

  6. 如何将eclipse里的项目发布到github

    首先,给eclipse安装上EGit 在“Help > Install new software”中添加 http://download.eclipse.org/egit/updates 两个都 ...

  7. bootstrap-datetimepicker配置选项

    依赖 需要bootstrap的下拉菜单组件 (dropdowns.less) 的某些样式,还有bootstrap的sprites (sprites.less and associated images ...

  8. IOS各类问题

    1.The resource could not be loaded because the App Transport Security policy requires the use of a s ...

  9. asp.net mvc4 webapi Post 参数 字符串

    用  mvc4中的WEBAPI, Post 到后台的参数如果为string,则直接接收不到,解决方案有两种 1.传递参数为自定义类 2.通过如下方式获取: //获取传统context var cont ...

  10. spoj SORTBIT - Sorted bit squence

    Let's consider the 32 bit representation of all integers i from m up to n inclusive (m ≤ i ≤ n; m × ...