一、SQLite升级和降级需要考虑的细节

①  SQLite升级:

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()

② SQLite 降级:

降级由于情况太多,复杂所以我们只做数据库V3.0降级到数据库V2.0:

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

③onCreate()和onUpgrade()升级,onDowngrade()降级方法执行的时机:

                   在上一张章onCreate和onUpgrade方法执行的时机博客中我们知道,先获取数据库的当前版本,当版本号为0的时候,就会执行onCreate方法(当数据库文件第一次创建的时候版本号就是0)如果版本号不为0,同时和最新版本号进行比较,如果大于的话,就执行升级操作onUpgrade方法,否则就执行降级onDowngrade方法。

二、相关代码:

1、升级:

创建一个openHelper3.java

openHelper3.java文件:

public class openHelper3 extends SQLiteOpenHelper {

    private static final String DB_NAME = "mydata.db"; // 数据库名称
private static final int version = 1; // 数据库版本
public openHelper3(Context context) {
super(context, DB_NAME, null, version);
// TODO Auto-generated constructor stub
} @Override
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
// 编写【从0开始到最新状态】建表语句
Log.i("hi", "没有数据库,创建v4.0数据库");
//0-->v3.0
String sql_message = "create table t_message (id int primary key,userName varchar(50),lastMessage varchar(50),datetime varchar(50),isdel bit default 0)";
String inse="insert into t_message values(1,'TT','一起去旅游','10月1号',0)";
db.execSQL(sql_message); db.execSQL(inse);
Log.i("d","ok");
}
//升级
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub
//v1.0-->v3.0
if(oldVersion==1)
{
String inse2="insert into t_message values(2,'TT2','一起去旅游','10月1号',0)";
String inse3="insert into t_message values(3,'TT3','一起去旅游','10月1号',0)";
db.execSQL(inse2);
db.execSQL(inse3);
Log.i("hi", "升级v1.0-->v3.0数据库");
}
//v2.0--->3.0
if(oldVersion==2)
{
String sql="alter table t_message add column isdel bit default 0";
db.execSQL(sql);
Log.i("hi", "升级v2.0-->v3.0数据库");
}
}
}

1、该类继承SQLiteOpenHelper对数据库进行相关的操作。

2、在onCreate()的方法创建表和添加数据,首先我们知道有3种情况 0-->v3.0,1-->v3.0,2-->v3.0。

3、onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)升级方法,在onCreate()和onUpgrade,onDowngrade()方法执行的时机知识点我们知道了执行顺序。所以在onCreate()方法中我们用来创建最新版本也就是0-->v3.0。

4、在onUpgrade()方法中我们可以通过oldVersion(旧版本)参数来进行判断,进行相关的操作。

    2、降级:

降级操作我们只需在 openHelper3.java文件文件中添加一个onDowngrade()降级方法。

public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion)
{ try {
//第一、先把t_message 未来的表,改名
String alt_table="alert table t_message rename to t_message_bak";
db.execSQL(alt_table);
//第二、建立2.0的表结构
String crt_table = "create table t_message (id int primary key,,userName varchar(50),lastMessage varchar(50),datetime varchar(50))";
db.execSQL(crt_table);
//第三、把备份的数据,copy到 新建的2.0的表
String cpy_table="insert into t_message select id,userName,lastMessage,datetime from t_message_bak";
db.execSQL(cpy_table);
//第四、把备份表drop掉
String drp_table = "drop table if exists t_message_bak";
db.execSQL(drp_table); } 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,userName varchar(50),lastMessage varchar(50),datetime varchar(50))";
String sql_init_1 = "insert into t_message values (2,'TT2','一起去旅游','10月1号')";
String sql_init_2 = "insert into t_message values (2,'TT2','一起去旅游','10月1号')";
String sql_init_3 = "insert into t_message values (2,'TT2','一起去旅游','10月1号')";
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);
}
}

这种情况是在已知备份了V2.0的数据,将V3.0的改名并且将数据复制到V2.0新建的表中,因为表结构可能存在差异导致复制失败,所以添加异常处理,如果降级失败,就删除原来的表重新建回v2.0的数据表,这样依旧可以实现重v3.0降级到v2.0。

Android之sqlite数据库版本升级和降级的处理(onUpgrade和onDowngrade)的更多相关文章

  1. Android SQLite数据库版本升级原理解析

    Android使用SQLite数据库保存数据,那数据库版本升级是怎么回事呢,这里说一下. 一.软件v1.0 安装v1.0,假设v1.0版本只有一个account表,这时走继承SQLiteOpenHel ...

  2. 转载:Android SQLite数据库版本升级原理解析

    Android使用SQLite数据库保存数据,那数据库版本升级是怎么回事呢,这里说一下. 一.软件v1.0 安装v1.0,假设v1.0版本只有一个account表,这时走继承SQLiteOpenHel ...

  3. Qt for Android 打包 SQLite 数据库

    Qt for Android 调用 SQLite 数据库时, 怎样将已经存在的数据库附加到 APK 中? 直接在你项目里面的Android源码的根目录下新建一个文件夹assets, 数据库就可以放里面 ...

  4. Android实现SQLite数据库联系人列表

    Android实现SQLite数据库联系人列表 开发工具:Andorid Studio 1.3 运行环境:Android 4.4 KitKat 工程内容 实现一个通讯录查看程序: 要求使用SQLite ...

  5. Android中SQLite数据库操作(1)——使用SQL语句操作SQLite数据库

    下面是最原始的方法,用SQL语句操作数据库.后面的"Android中SQLite数据库操作(2)--SQLiteOpenHelper类"将介绍一种常用的android封装操作SQL ...

  6. android中sqlite数据库的基本使用和添加多张表

    看了很多关于android使用sqlite数据库的文章,很多都是介绍了数据库的建立和表的建立,而表通常都是只建立一张,而实际情况我们用到的表可能不止一张,那这种情况下我们又该怎么办呢,好了,下面我教大 ...

  7. android 一个SQLite数据库多个数据表的基本使用框架 (带demo)

    android 一个SQLite数据库多个数据表(带demo) 前言        demo演示        一.搭建        二.建立实体类        三.建立数据库操作类        ...

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

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

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

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

随机推荐

  1. 『TensorFlow』模型保存和载入方法汇总

    『TensorFlow』第七弹_保存&载入会话_霸王回马 一.TensorFlow常规模型加载方法 保存模型 tf.train.Saver()类,.save(sess, ckpt文件目录)方法 ...

  2. ceph crush的问题

    ceph crush的问题看一遍忘一遍,现将<ceph源码分析>一书中相关章节摘抄如下: 4.2.1 层级化的Cluster Map例4-1 Cluster Map定义层级化的Cluste ...

  3. CSS布局-body高度不等于页面高度

    记录采坑: 博客记录问题,用作回忆用,不喜勿喷! html,body{width: 100%; height: 100%}这是初始定义的宽高.在布局越写越复杂的时候,布局很容易出现问题,例如一个页面中 ...

  4. tf 随机数

    tf生成随机数 import tensorflow as tf sess = tf.InteractiveSession() ### 生成符合正态分布的随机值 # tf.random_normal(s ...

  5. HTTP,RFC自学心得

    HTTP协议描述的是:发送方与接收方的通信协议,通过两方的自觉遵守而存在,当然有不少的浏览器并没有百分百遵守这份协议. HTTP是运行于应用层的协议,基于TCP协议而运作.基本上是客户/服务器对答模式 ...

  6. Git 与SVN

    SVN 是集中式版本控制系统: 先说集中式版本控制系统,版本库是集中存放在中央服务器的,而干活的时候,用的都是自己的电脑,所以要先从中央服务器取得最新的版本,然后开始干活,干完活了,再把自己的活推送给 ...

  7. Linux性能监控分析命令(一)—vmstat命令详解

    一.vmstat介绍 语法格式: vmstat [-V] [-n] [-S unit] [delay [count]] -V prints version. -n causes the headers ...

  8. 成员变量位置获取url

  9. yarn不是内部指令 react-native不是内部指令

    1.先查看是否全局安装 2.我遇到的是,全局安装了,依然有问题. 昨天装了一个高版本的node,成功后有个黑窗口我点了几个回车,在我的环境变量里加了一大推重复的变量,删除就正常了,如下图是我删完之后的

  10. C#如何运行外部程序(打开可执行程序):ShellExcute和Process

    最近的任务用到C#来调用C++内核程序,也就是C++编译运行后生成的.exe文件.网搜了一下C#中运行外部程序大致有两种方法,在此稍作总结: (1)使用API函数ShellExcute 添加引用 us ...