android数据库降级_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 extendsSQLiteOpenHelper {private static final String DB_NAME = "mydata.db"; //数据库名称
private static final int version = 1; //数据库版本
publicopenHelper3(Context context) {super(context, DB_NAME, null, version);//TODO Auto-generated constructor stub
}
@Overridepublic voidonCreate(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");
}//升级
@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, intnewVersion) {//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, intnewVersion)
{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数据库降级_Android之sqlite数据库版本升级和降级的处理(onUpgrade和onDowngrade)...相关推荐
- 在 Android 应用程序中使用 SQLite 数据库以及怎么用
part one : android SQLite 简单介绍 SQLite 介绍 SQLite 一个非常流行的嵌入式数据库.它支持 SQL 语言,而且仅仅利用非常少的内存就有非常好的性能.此外它还是开 ...
- android模拟器的数据存放,Android模拟器在哪里存储SQLite数据库?
Android模拟器在哪里存储SQLite数据库? 我正在开发一个将数据存储在SQLite数据库中的Android应用程序. 我的问题是,当您使用模拟器时,此数据库文件存储在文件系统中的哪个位置? 我 ...
- android打开sqlite数据库,Android:打开和关闭SQLite数据库
我正在开发和android应用程序,我经常使用它访问本地数据库.这个数据库可以从不同的therads访问,所以我对数据库有一个协调问题.我使用以下open()和close()方法.Android:打开 ...
- 在Android中查看和管理sqlite数据库
在Android中查看和管理sqlite数据库 在Android中可以使用Eclipse插件DDMS来查看,也可以使用Android工具包中的adb工具来查看.android项目中的sqlite数据库 ...
- android指定sqlite路径_Android:自定义Sqlite数据库路径
默认的sqlite数据库是放在/data/data/database目录下的,今天看腾讯云IM的demo发现再该路径下找不到它存放消息的数据库,找了下后发现居然是放在/data/data/files目 ...
- android查询mysql并显示_Android操作SQLite数据库(增、删、改、查、分页等)及ListView显示数据的方法详解...
本文实例讲述了Android操作SQLite数据库(增.删.改.查.分页等)及ListView显示数据的方法.分享给大家供大家参考,具体如下: 由于刚接触android开发,故此想把学到的基础知识记录 ...
- Android内部自带的SQLite数据库操作dos命令
1:什么叫做SQLite数据库 Android系统内核是Linux系统,Android系统很特殊,他自带了一个SQLite数据库,轻量型的一款嵌入式的数据库 它占用资源非常的低,在嵌入式设备中,可能只 ...
- java sqlite 多线程并发_Android中Sqlite数据库多线程并发问题
最近在做一个Android项目, 为了改善用户体验,把原先必须让用户"等待"的过程改成在新线程中异步执行.但是这样做遇到了多个线程同时需要写Sqlite数据库,导致操作数据库失败. ...
- android studio SQLScout插件查看sqlite数据库
SQLScout (SQLite Support) SQLScout (SQLite Support) 是android studio集成开发工具中查看SQLite数据库的插件. 1.安装 file- ...
- android 访问sqlite,android中访问已有的sqlite数据库
推荐文章 每天进步记录一点点 话说经常性的操作svn出现各种问题,而度娘一直帮倒忙,是不是很手足无措. 有时问题还是要记录下来的.说不定还会有惊喜. 昨天遇到个问题,搜索了一下,发现第一条就是自己写的 ...
最新文章
- 深入理解js的执行机制
- 计算机毕业生求职之路
- 鏖战双十一-阿里直播平台面临的技术挑战
- html缓存在本地缓存,HTML5 本地缓存 window.localStorage
- c语言第六次实验报告,第一年C语言实验报告6列
- MTK 驱动开发(35)---待机功耗分析流程
- 新技能Get:如何利用HTTP技术提升网页的加载速度
- 超级无敌数字加密算法
- qq2018旧版本7.3.1下载_qq音乐2018老版本下载
- python day 105
- 在图书馆使用计算机管理属于,图书馆计算机使用管理规定
- 二、python解析XML文档
- iOS UI第一阶段笔记
- html5 视频缩略图,应用canvas获取video的缩略图
- 屏蔽第三方SDK权限
- markman高效的设计稿标注、测量工具
- 多个图片合并为一个压缩包下载
- Py遇到Bad key “text.kerning_factor“ on line 4 in
- 【Android 10 源码】healthd 模块 BatteryService 初始化
- 做设计常用的素材下载网站
热门文章
- vue中的key有什么作用?(key的内部原理)
- cpan mysql dbd_安装PERL cpan DBD::mysql错误笔记
- 泛函分析之集合的映射和可数集与不可数集
- autosar arxml文件配置(四)
- Vue:成功解决[Vue warn]: Failed to resolve directive: modle (found in Anonymous)
- Java课程寒假之开发记账本软件(网页版)之三
- 以计算机的发展写一篇英语作文,写一篇关于网络的英语作文
- Java程序员月薪20k的涨薪秘籍,没点绝活敢跳槽吗?
- aardio - 仿安装界面进行窗口高度调节的方法
- HTC IMEI码或SN码查询地址