今天我们主要学习了数据库版本升级对软件的管理操作。

我们手机经常会收到xxx软件升级什么的提醒,你的软件版本更新,同时你的数据库对应的版本也要相应的更新。

数据库版本更新需要主要的问题:

  软件的1.0版本升级到1.1版本时,老的数据不能丢。

  那么在1.1版本的程序中就要有地方能够检测出来新的软件版本与老的数据库不兼容,并且能够有办法把1.0软件的数据库升级到1.1软件能够使用的数据库。

  换句话说,要在1.0软件的数据库的那个表中增加那个字段,并赋予这个字段默认值。

当然有的时候我们对更新后的 版本并没有什么好感,还不如原来的版本用的顺手,那么我们就会对自己的软件进行降级操作。

接下来是对升降级数据库版本操作的一个分析。

  当系统在构造SQLiteOpenHelper类的对象时,如果发现版本号不一样,就会自动调用onUpgrade函数,让你在这里对数据库进行升级。

根据上述场景,在这个函数中把老版本数据库的相应表中增加字段,并给每条记录增加默认值即可。

新版本号和老版本号都会作为onUpgrade函数的参数传进来,便于开发者知道数据库应该从哪个版本升级到哪个版本。

升级完成后,数据库会自动存储最新的版本号为当前数据库版本号。

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

  我们用代码描述下版本升级的操作。

这个mainActivity.class 启动数据库连接

package com.example.testdb;

import android.app.Activity;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle; public class MainActivity extends Activity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//创建数据库
MyDatabaseOpenHelper helper = new MyDatabaseOpenHelper(MainActivity.this);
//获取数据库连接
SQLiteDatabase db = helper.getWritableDatabase();
//关闭数据库
db.close(); } }

我们创建一个 MyDatabaseOpenHelper .class 进行数据库版本更新操作。

package com.example.testdb;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
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 = 1;//数据库版本 public MyDatabaseOpenHelper(Context context) {
super(context, DB_NAME, null, version); } //问题:什么时候执行? 当没有前生的时候执行
//onCrate 是一个回调函数
@Override
public void onCreate(SQLiteDatabase db) {
//编写 [从0开始到最新状态]
//建表语句
Log.i("hey", "没有数据库,创建数据库。创建1.0成功");
String sql_message = "create table t_message (uid integer primary key autoincrement,toul varchar(50),userName varchar(50),lastMessage varchar(50),datetime varchar(50) )";
db.execSQL(sql_message);
String inset_sql1 = "insert into t_message(toul,userName,lastMessage,datetime) values('aaa1','oracle1','oracle, hhz 1','11月20日')";
String inset_sql2 = "insert into t_message(toul,userName,lastMessage,datetime) values('aaa2','oracle2','oracle, hhz 2','11月20日')";
String inset_sql3 = "insert into t_message(toul,userName,lastMessage,datetime) values('aaa3','oracle3','oracle, hhz 3','11月20日')";
db.execSQL(inset_sql1);
db.execSQL(inset_sql2);
db.execSQL(inset_sql3); }
//从版本一升级到版本二,给表添加数据
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { } }

运行后会在logcat 打印 

说明最初它是从0 开始进行版本1  的创建。并插入了初始数据

我们利用昨天的方法将数据库导出,select 一下,也是可以清楚他最初的这个 onCreate 操作。

那么我们现在在有版本1的情况下对版本进行升级。添加一个列

这里我们就要用到onUpgrade() 我们参照前面的分析表,当升级的时候分两种情况,

package com.example.testdb;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
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); } //问题:什么时候执行? 当没有前生的时候执行
//onCrate 是一个回调函数
@Override
public void onCreate(SQLiteDatabase db) {
//编写 [从0开始到最新状态]
//建表语句
Log.i("hey", "没有数据库,创建数据库。创建1.0成功");
String sql_message = "create table t_message (uid integer primary key autoincrement,toul varchar(50),userName varchar(50),lastMessage varchar(50),datetime varchar(50),isdel bit default 0 )";
db.execSQL(sql_message);
String inset_sql1 = "insert into t_message(toul,userName,lastMessage,datetime) values('aaa1','oracle1','oracle, hhz 1','11月20日')";
String inset_sql2 = "insert into t_message(toul,userName,lastMessage,datetime) values('aaa2','oracle2','oracle, hhz 2','11月20日')";
String inset_sql3 = "insert into t_message(toul,userName,lastMessage,datetime) values('aaa3','oracle3','oracle, hhz 3','11月20日')";
db.execSQL(inset_sql1);
db.execSQL(inset_sql2);
db.execSQL(inset_sql3); }
//从版本一升级到版本二,给表添加数据
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { if(oldVersion == 1) {
String update_1 = "alter table t_message add column isdel bit default 0";
db.execSQL(update_1);
String inset_sql1 = "insert into t_message(toul,userName,lastMessage,datetime) values('aaa1','oracle1','oracle, hhz 1','11月20日')";
String inset_sql2 = "insert into t_message(toul,userName,lastMessage,datetime) values('aaa2','oracle2','oracle, hhz 2','11月20日')";
String inset_sql3 = "insert into t_message(toul,userName,lastMessage,datetime) values('aaa3','oracle3','oracle, hhz 3','11月20日')";
db.execSQL(inset_sql1);
db.execSQL(inset_sql2);
db.execSQL(inset_sql3);
Log.i("db", "版本1升级到2成功");
} } }

  运行后我们成功将版本一升级至版本二。

这里的其他操作我就不演示了。

接下来我们讲讲降级的操作。

我先将版本3降级至版本2

/* 模拟从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 (uid integer primary key autoincrement,toul varchar(50),userName varchar(50),lastMessage varchar(50),datetime varchar(50),isdel bit default 0 )";
db.execSQL(sql_message);
Log.i("down", "2.建立2.0表结构成功");
//第三、把备份的数据,copy到 新建的2.0的表
String sql_copy = "insert into t_message select uid,toul,userName,lastMessage,datetime,isdel 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";
db.execSQL(sql_drop_old_table);
onCreate(db);
}
}

注意记得将版本号改为2

当看见logcat的打印上面的内容就说明版本降级成功了。

当然最后我们还是要将表导出,在cmd查询一遍内容是否一致。

今天的内容大概这么多,还有很多不懂 ,请大家一起指教。

Android_SQLite版本升级,降级 管理的更多相关文章

  1. 使用Hystrix进行微服务降级管理

    前言:目前我们的项目是微服务架构,基于dubbo框架,服务之间的调用是通过rpc调用的.刚开始没有任何问题,项目运行健康.良好.可是过了一段时间,线上总有人反应查询订单失败,等过了一段时间才能查到.这 ...

  2. 运维自动化之1 - ansible 批量主机管理

    2000 - 2016 年,维护的小型机.linux刚开始的2台增加到上千台,手工检查.日常版本升级需要管理太多设备,必须通过运维自动化实现 特别是版本升级,需要到同类机器部署代码.起停设备,必须在一 ...

  3. Android 应用框架层 SQLite 源码分析

    概述   Android 在应用框架层为开发者提供了 SQLite 相关操作接口,其归属于android.database.sqlite包底下,主要包含SQLiteProgram, SQLiteDat ...

  4. Erlang模块gen_server翻译

    gen_server 概要: 通用服务器行为描述: 行为模块实现服务器的客户端-服务器关系.一个通用的服务器进程使用这个模块将实现一组标准的接口功能,包括跟踪和错误报告功能.它也符合OTP进程监控树. ...

  5. 写给大忙人的spring cloud 1.x学习指南

    这几天抽空搞了下spring cloud 1.x(2.0目前应该来说还不成熟),因为之前项目中使用dubbo以及自研的rpc框架,所以总体下来还是比较顺利,加上spring boot,不算笔记整理,三 ...

  6. caffe—ssd安装教程

    环境: ubuntu16.04 cuda8.0 cudnn5.0 已安装过caffe1.0 tensorflow1.2 编辑过程中出现问题尽量到这里面搜一下:https://github.com/BV ...

  7. Spring Cloud微服务安全实战_00_前言

    一.前言: 一直以来对服务安全都很感兴趣,所以就学习.这是学习immoc的 jojo老师的 <Spring Cloud微服务安全实战课程>的笔记,讲的很好. 课程简介:  二.最终形成的架 ...

  8. 【HICP Gauss】数据库 数据库管理(shutdown 日志 连接命令)-5

    数据库关闭终止Zengine进程关闭数据库 会导致无法预料的状态 建议shutdown关闭数据库 shutdown 模式1.normal默认 停止新请求 断开等待会话 关闭服务 终止主进程 需要连接发 ...

  9. spring cloud学习笔记四 熔断器Hystrix

    我们知道分布式服务有这样一个特点,每一个微服务都有自己的业务,并且很多时候一个微服务的业务要依赖于其他微服务,如果这些相互关联的微服务中其中某个微服务请求失败时,就会导致其他调用它的微服务也会请求失败 ...

随机推荐

  1. Azure

    ylbtech-Miscellaneos:Azure A,返回顶部 1, Windows Azure是微软基于云计算的操作系统,现在更名为“Microsoft Azure”,和Azure Servic ...

  2. JVM实用参数(五)新生代垃圾回收

    本部分,我们将关注堆(heap) 中一个主要区域,新生代(young generation).首先我们会讨论为什么调整新生代的参数会对应用的性能如此重要,接着我们将学习新生代相关的JVM参数. 单纯从 ...

  3. ses_cations 值顺序

    16个位置的字符所代表的操作依次如下: 1. ALTER 2. AUDIT 3.COMMENT 4.DELETE 5.GRANT 6.INDEX 7.INSERT 8.LOCK 9.RENAME 10 ...

  4. 用读写锁三句代码解决多线程并发写入文件 z

    C#使用读写锁三句代码简单解决多线程并发写入文件时提示“文件正在由另一进程使用,因此该进程无法访问此文件”的问题 在开发程序的过程中,难免少不了写入错误日志这个关键功能.实现这个功能,可以选择使用第三 ...

  5. 解决 connect to host github.com port 22 operation timed out

    本来好好地.不知道为什么不能push了.估计是被墙,于是搜搜解决办法.改换端口 参考 https://mozillazg.com/2015/08/use-443-port-fix-github-con ...

  6. mybatis 中${}和#{}区别

    用#传入参数是,sql语句解析是会加上"",比如  select * from table where name = #{name} ,传入的name为小李,那么最后打印出来的就是 ...

  7. 01-C#入门(函数重载、委托)

    函数的重载 相对委托,是比较好理解的. 涉及一个概念:函数签名.函数签名包括函数的名称和参数,而函数重载:就是使用相同的名称和不同的参数(参数类型.传递方式[传值或引用])来实现的.而不能声明相同的函 ...

  8. WinForms中的Label的AutoSize属性

    当大量使用UserControl组合UI时,如果更改了Label的Text属性,Label.AutoSize属性会影响UserControl的OnLoad事件的发生顺序; public overrid ...

  9. OS X升级El Capitan后,git difftool无法打开diffmerge的解决方法

    在git项目下执行git difftool,出现如下报错 /Library/Developer/CommandLineTools/usr/libexec/git-core/mergetools/dif ...

  10. 解决java文件编码和windows7系统(中文版)默认编码冲突所导致的乱码情况

    开篇从一个比较简单但是也比较蛋疼的问题开始吧. 背景介绍:我是新手小白,初学java. 问题介绍:在使用UTF-8编码格式写java文件时,编译出现问题. 原因分析:1.java文件的编码格式是UTF ...