Android之sqlite数据库版本升级和降级的处理(onUpgrade和onDowngrade)
一、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)的更多相关文章
- Android SQLite数据库版本升级原理解析
Android使用SQLite数据库保存数据,那数据库版本升级是怎么回事呢,这里说一下. 一.软件v1.0 安装v1.0,假设v1.0版本只有一个account表,这时走继承SQLiteOpenHel ...
- 转载:Android SQLite数据库版本升级原理解析
Android使用SQLite数据库保存数据,那数据库版本升级是怎么回事呢,这里说一下. 一.软件v1.0 安装v1.0,假设v1.0版本只有一个account表,这时走继承SQLiteOpenHel ...
- Qt for Android 打包 SQLite 数据库
Qt for Android 调用 SQLite 数据库时, 怎样将已经存在的数据库附加到 APK 中? 直接在你项目里面的Android源码的根目录下新建一个文件夹assets, 数据库就可以放里面 ...
- Android实现SQLite数据库联系人列表
Android实现SQLite数据库联系人列表 开发工具:Andorid Studio 1.3 运行环境:Android 4.4 KitKat 工程内容 实现一个通讯录查看程序: 要求使用SQLite ...
- Android中SQLite数据库操作(1)——使用SQL语句操作SQLite数据库
下面是最原始的方法,用SQL语句操作数据库.后面的"Android中SQLite数据库操作(2)--SQLiteOpenHelper类"将介绍一种常用的android封装操作SQL ...
- android中sqlite数据库的基本使用和添加多张表
看了很多关于android使用sqlite数据库的文章,很多都是介绍了数据库的建立和表的建立,而表通常都是只建立一张,而实际情况我们用到的表可能不止一张,那这种情况下我们又该怎么办呢,好了,下面我教大 ...
- android 一个SQLite数据库多个数据表的基本使用框架 (带demo)
android 一个SQLite数据库多个数据表(带demo) 前言 demo演示 一.搭建 二.建立实体类 三.建立数据库操作类 ...
- Android版本更新时对SQLite数据库升级或者降级遇到的问题
SQLite是Android内置的一个很小的关系型数据库.SQLiteOpenHelper是一个用来辅助管理数据库创建和版本升级问题的抽象类.我们可以继承这个抽象类,实现它的一些方法来对数据库进行自定 ...
- App版本更新时对SQLite数据库升级或者降级遇到的问题
SQLite是Android内置的一个很小的关系型数据库.SQLiteOpenHelper是一个用来辅助管理数据库创建和版本升级问题的抽象类.我们可以继承这个抽象类,实现它的一些方法来对数据库进行自定 ...
随机推荐
- windows10安装MongoDB服务启动不了 😀✅已解决!
WIndows的服务中,有一个服务需要以NT AUTHORITY\NetworkService用户启动,但怎么也启动不起来,使用本地系统帐户启动没有任何问题,但是换成NetworkService就启 ...
- arrow function、function.apply
An arrow function expression has a shorter syntax than a function expression and does not have its o ...
- vs 设置自动缩进tab转换成空格
工具 选项 文本编辑器 如下图 选中插入空格 使用技巧: 按Ctrl+K+F组合键,可以自动进行代码对齐.
- Excel遇到的坑lookup和vlookup的用法
lookup (第一种) lookup必选保证有序查询,学籍号是按顺序排的 如上表格,表格2的成绩输入到表格1成绩中 鼠标选择F3->公式->插入函数->搜索lookup 三个参数 ...
- elinks快捷方式
突然有兴趣看看Linux下的字符模式的浏览器,搜了下有好几个,在Ubuntu里“添加/删除”里找到一个,叫Elinks,安装,然后在终端运行elinks,试用了一下,不错,使用方法也挺简单的,支持多标 ...
- codeblock不能调试
问题:codeblock 不能调试,如下图: 解决方法: 首先,项目的保存路径不能是中文路径. 其次,必须创建工程. 最后,build选项里select target选成debug codebloc ...
- 【阅读笔记】《C程序员 从校园到职场》第六章 常用文件操作函数 (Part 1)
参考链接:https://blog.csdn.net/zhouzhaoxiong1227/article/details/24926023 让你提前认识软件开发(18):C语言中常用的文件操作函数总结 ...
- Android : 跟我学Binder --- (3) C程序示例
目录: Android : 跟我学Binder --- (1) 什么是Binder IPC?为何要使用Binder机制? Android : 跟我学Binder --- (2) AIDL分析及手动实现 ...
- unity3d平铺图片
using System;using System.Linq;using System.Text;using System.Reflection;using System.Collections;us ...
- python基础之centos6.5 升级 python2.7, 安装pip, MySQLdb
这个仅仅是为了运行脚本需求, 将centos6.5中的 python 2.6.6升级到了 2.7 并且安装和了 pip 和 MySQLdb 1.先装依赖 yum install zlib-devel ...