借用API文档解释:

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

当数据库需要升级时,会调用这个方法。应该使用这个方法来实现删除表、添加表或者做一些需要升级新的策略版本的事情。

SQLite ALTER TABLE的文档可以在以下网址中找到:

http://sqlite.org/lang_altertable.html

如果要给表添加一个新列,那么使用使用ALTER TABLE能够把新列插入到表中。如果要重命名或删除列,那么你能够使用ALTER TABLE能够重命名旧表,然后,创建一个新表,并把旧表中内容复制到新表中。

这个方法是事务中执行的,如果有异常被抛出,所有的改变都会被自动的回滚。

参数:

db:指定要降级的数据库

oldVersion:旧的数据库版本

newVersion:新的数据库版本

总结:

  

v1.0
  1.没有安装过 onCreate()

--------------------------------------
v2.0 [onUpgrade 情况:n-1,onCreate 情况:1]
  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()


public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion)

当数据库需要被降级时,调用这个方法。这个方法与onUpgrade(SQLiteDatabase, int, int)方法非常相似,但是它是在当前版本比请求的版本新的时候,才会被调用。但是这个方法不是抽象的,因此它不是强制要求客户实现它的。如果这个方法没有被重写,默认的实现会拒绝降级处理,并抛出SQLiteException异常。

这个方法是在事务中执行的。如果有异常被抛出,所有的改变都会被回滚。

参数:

db:指定要降级的数据库

oldVersion:旧的数据库版本

newVersion:新的数据库版本

总结:

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

下面是老师上课的案例:


 package com.example.winxin2;

 import android.content.Context;
 import android.database.sqlite.SQLiteDatabase;
 import android.database.sqlite.SQLiteDatabase.CursorFactory;
 import android.database.sqlite.SQLiteOpenHelper;
 import android.util.Log;

 public class MyDatabaseOpenHelper extends SQLiteOpenHelper {

     private static final String DB_NAME = "mydata.db"; // 数据库名称
     private static final int version = 2; // 数据库版本

     public MyDatabaseOpenHelper(Context context) {
         super(context, DB_NAME, null, version);
     }

     // 问题:什么时候执行
     // 没有前生
     @Override
     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);

     }

     // v2.0 现在进行时
     @Override
     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
         if (oldVersion == 2){
             String sql_upgrade_1 = "alter table t_message add column isdel bit default 0";
             db.execSQL(sql_upgrade_1);
             Log.i("db", "从2到3,升级成功!");
         }

         if (oldVersion == 1) {
             String sql_upgrade_1 = "alter table t_message add column isdel bit default 0";
             db.execSQL(sql_upgrade_1);
             String sql_init_1 = "insert into t_message values (1,'abc','abc1','abcd1','hi1',0)";
             String sql_init_2 = "insert into t_message values (2,'abc','abc2','abcd2','hi1',0)";
             String sql_init_3 = "insert into t_message values (3,'abc','abc2','abcd2','hi1',0)";
             db.execSQL(sql_init_1);
             db.execSQL(sql_init_2);
             db.execSQL(sql_init_3);
             Log.i("db", "从1到3,升级成功!");
         }
     }

     /* 模拟从3.0 降低会2.0 */
     @Override
     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);
         }
     }

 }

我自己总结了一下:

  1、创建一个继承SQLiteOpenHelper 的类,实现未实现的方法

  2、里面方法采用回调函数,当触发时,系统会自动调用,不用我们手动调

  3、onCreate()方法写最新版本的数据库创建和初始化

  4、onUpgrade()方法写版本更新时数据库更新代码(考虑新客户和老客户,如果太久远的版本可以直接放弃维护,直接弹框要求用户更新最新版本)

  5、onDowngrade()方法注意需要保存关键数据,和try catch

还有很多的不懂,如发现有错,留言告诉我,大家互相学习

Android之数据库升级onUpgrade降级onDowngrade的更多相关文章

  1. Android笔记——数据库升级与降级

    一.概述 SQLite是Android内置的一个很小的关系型数据库.SQLiteOpenHelper是一个用来辅助管理数据库创建和版本升级问题的抽象类.我们可以继承这个抽象类,实现它的一些方法来对数据 ...

  2. Android数据库升级、降级、创建(onCreate() onUpgrade() onDowngrade())[4]

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

  3. Android版本更新时对SQLite数据库升级或者降级遇到的问题

    SQLite是Android内置的一个很小的关系型数据库.SQLiteOpenHelper是一个用来辅助管理数据库创建和版本升级问题的抽象类.我们可以继承这个抽象类,实现它的一些方法来对数据库进行自定 ...

  4. App版本更新时对SQLite数据库升级或者降级遇到的问题

    SQLite是Android内置的一个很小的关系型数据库.SQLiteOpenHelper是一个用来辅助管理数据库创建和版本升级问题的抽象类.我们可以继承这个抽象类,实现它的一些方法来对数据库进行自定 ...

  5. [android] SQLite 数据库的升级 和 降级

    public class SqliteHelp extends SQLiteOpenHelper { /* * context:创建数据库所需的 上下文对象 * name: 数据库名字 * facto ...

  6. android 数据库的升级与降级解决方案

    在我们写的程序中不避免的需要升级.或者说需要改变业务逻辑,那这个时候就需要修改数据库的字段,来适应不同的表结构 我们一般写数据库都是操作一个继承至 SQLiteOpenHelper 的类 然后我们需要 ...

  7. android——数据库版本升/降级问题

    数据库版本升级 在开发android应用程序的时候,一般由于在我们开发的时候我们不知道以后会后什么新功能,也有可能增加业务逻辑(也就是更新),可想而知我们原来的数据库结构可能不适用已更新的应用,那么应 ...

  8. 优雅的处理Android数据库升级的问题

    原始完成于:2015-04-27 19:28:22 提供一种思路,优雅的处理Android数据库升级的问题,直接上代码: 1 package com.example.databaseissuetest ...

  9. Android 数据库升级解决方案

    转自:http://blog.csdn.net/leehong2005/article/details/9128501 请考虑如下情况: 在数据库升级时,不同版本的数据库,他们定义的表结构完全可能是不 ...

随机推荐

  1. C/C++实践笔记 006

    字符与字符串字符按照%d,打印ASCCII字符按%c,打印字符本身‘0’ 0 ‘\0’区别: char ch3=0; 等号会自动转换,转换成ASCCII值所对应的字符.即null或\0C字符串不可以直 ...

  2. selenium RC+JAVA 笔记 一

    selenium 常用操作有:open,type,click,select,selectFrame. package com.example.tests; import com.thoughtwork ...

  3. 使用 Spring 进行单元测试

    一.使用spring中对Junit框架的整合功能 除了junit4和spring的jar包,还需要spring-test.jar.引入如下依赖: <dependency> <grou ...

  4. PHP函数-检查某个值是否存在于数组中

    函数:in_array -- 检查数组中是否存在某个值定义:bool in_array ( mixed needle, array haystack [, bool strict] )在haystac ...

  5. BigInteger类

    当一个数字非常大时,则肯定无法使用基本类型接受,所以使用了BigInteger类. BigInteger类表示是大整数类,定义在java.math包中,如果在操作时一个整型数据已经超过了整数的最大类型 ...

  6. mysql导入数据出错

    今天准备移动网站到另外一个服务器,用的是mysql数据库,导出的时候正常,导入的时候出现了一个错误,纠结了半天 最后打开sql文件发现导出的sql确实有问题 具体什么原因不清楚,只好把以前备份的sql ...

  7. SEO 相关知识

    传统SEO 观念 换独立服务器 加硬件 减少http请求,压缩网页体积 css 放页面顶部,js 放页面底部 一个中等规模网站的架构 技术角度 切换不同的 User-agent Chrome 的 Ne ...

  8. 腾讯首度公开S级手游品质管理方法

    weimjsam   引言 在最新的手游市场占有率统计中,腾讯游戏稳稳占据一半江山,目前仍以每月一到两款的速度推出新品,在如此复杂多变.响应要求极高的市场环境下,能持续推出高质量产品并保持高效迭代更新 ...

  9. jQuery on()方法示例及jquery on()方法的优点

    jQuery on()方法是官方推荐的绑定事件的一个方法. $(selector).on(event,childSelector,data,function,map) 由此扩展开来的几个以前常见的方法 ...

  10. 程序员定制的中州韵(rime)windows版(小狼毫)微软双拼输入法

    小狼毫所有的配置都是在用户文件夹下完成的 用户文件夹在win7的开始菜单的小狼毫文件夹中可以找到 所有设置希望生效须用小狼毫开始菜单中的重新部署来更新配置 -> weasel.custom.ya ...