数据库版本升级对软件的管理操作。

我们手机经常会收到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、考虑云端要保存用户【自定义数据、行为习惯】。专业术语profile-->>提高用户黏度
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 { 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(); } }

MainActivity

这是整体代码   直接运行会有错  下面会一一说

package com.example.winxinmff;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log; public class MyDatabaseOpenHelper extends SQLiteOpenHelper {
/***
* 数据库的版本必须大于0,否则报错: Unable to start activity
* java.lang.IllegalArgumentException: Version must be >= 1, was 0
*/ private static final String DB_NAME = "mydata.db"; // 数据库名称
private static final int version = 1; // 数据库版本 // http://www.cnblogs.com/xinye/p/3481352.html
public MyDatabaseOpenHelper(Context context) {
super(context, DB_NAME, null, version); } // 问题: 什么时候执行
// 没有前生
// 这个方法 数据库被首次创建时,会调用这个方法。这时创建数据库表和表初始化的地方。
// 1、在第一次打开数据库的时候才会走(运行)
// 2、在清除数据之后再次运行-->打开数据库,这个方法会走
// 3、没有清除数据,不会走这个方法
// 4、数据库升级的时候这个方法不会走
public void onCreate(SQLiteDatabase db) {
// 编写 [从0开始到最新状态] 建表语句
Log.i("hi", "没有数据库,创建数据库,创建v1.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); /*String sql_init_1 = "insert into t_message values(1,'abc','aaa1','11.11','hi1')";
db.execSQL(sql_init_1); String sql_init_2 = "insert into t_message values(2,'abc','aaa2','11.11','hi1')";
db.execSQL(sql_init_2); String sql_init_3 = "insert into t_message values(3,'abc','aaa3','11.11','hi1')";
db.execSQL(sql_init_3);*/ } // v2.0 现在进行时
// 1、第一次创建数据库的时候,这个方法不会走
// 2、清除数据后再次运行(相当于第一次创建)这个方法不会走
// 3、数据库已经存在,而且版本升高的时候,这个方法才会调用
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','aaa1','11.11','hi1',0)";
db.execSQL(sql_init_1); String sql_init_2 = "insert into t_message values(2,'abc','aaa2','11.11','hi1',0)";
db.execSQL(sql_init_2); String sql_init_3 = "insert into t_message values(3,'abc','aaa3','11.11','hi1',0)";
db.execSQL(sql_init_3); Log.i("db", "从一到3, 升级成功!"); } } // 模拟从3.0 降低回2.0
// 执行数据库的降级操作
// 1、只有新版本比旧版本低的时候才会执行
// 2、如果不执行降级操作,会抛出异常
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";
db.execSQL(sql_drop_old_table); 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); String sql_init_1 = "insert into t_message values (1,'abc','abc1','abcd1','hi1')";
db.execSQL(sql_init_1); String sql_init_2 = "insert into t_message values (2,'abc','abc2','abcd2','hi1')";
db.execSQL(sql_init_2); String sql_init_3 = "insert into t_message values (3,'abc','abc2','abcd2','hi1')";
db.execSQL(sql_init_3);
} } }

MyDatabaseOpenHelper

[1] 把数据库版本为设置为 1

[2] 把插入语句注释  只留下创建表的语句

现在是第一次运行 日志打印出 32行的话

现在我们用命令看看表

在1.0版本里  成功创建了表

看2.0版本

[1] 卸载程序

[2] 把数据库版本为设置为 2

[3] 把插入语句的注释去掉

重写导出数据库   查看

在2.0版本里  成功创建了表插入了数据

从2.0到3.0版本(升级)

[1] 把数据库版本为设置为 3

运行的日志

重写导出数据库   查看

在3.0版本里  成功更改的表结构默认插入为零

重新从3.0到2.0版本(降级)

[1] 把数据库版本为设置为 2

运行的日志

重写导出数据库   查看

最后推荐一个博客文章http://www.cnblogs.com/xinye/p/3481352.html

Android数据库升级、降级、创建(onCreate() onUpgrade() onDowngrade())[4]的更多相关文章

  1. Android数据库升级、降级、创建(onCreate() onUpgrade() onDowngrade())的注意点

    以下内容可以作为面试官在面试的时候的问题,感觉比较好,是比较常用的知识点,可以用来考察基础是否扎实. 也可以程序猿学习.开发中的注意点.因为稍微不注意,就有可能导致数据库不能用. DBAdapter. ...

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

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

  3. Android数据库升级

    随着Android应用版本的迭代,经常遇到数据库表结构发生改变,或者一些指定的表数据需要更新.这也就引出一个问题Android数据库的更新问题. Android数据库升级分类 Android数据库更新 ...

  4. Android数据库表的创建和数据升级操作

    之前的文章有提到,可以在xml文件中配置数据库信息:http://www.cnblogs.com/wenjiang/p/4492303.html,现在就讲如何利用这些信息类构建数据库. xml文件大概 ...

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

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

  6. Android 数据库升级中数据保持和导入已有数据库

    一.数据库升级: 在我们的程序中,或多或少都会涉及到数据库,使用数据库必定会涉及到数据库的升级,数据库升级带来的一些问题,如旧版本数据库的数据记录的保持,对新表的字段的添加等等一系列问题,还记得当我来 ...

  7. Android数据库升级不丢失数据解决方案

    在Android开发中,sqlite至关重要,增删查改不多说,难点在于,1,并发,多个线程同时操作数据库.2,版本升级时,如果数据库表中新加了个字段,如何在不删除表的情况下顺利过渡,从而不丢失数据. ...

  8. Android数据库升级实例

    第一部分 Andoird的SQLiteOpenHelper类中有一个onUpgrade方法.帮助文档中只是说当数据库升级时该方法被触发.经过实践,解决了我一连串的疑问: 1. 帮助文档里说的“数据库升 ...

  9. Android数据库升级,数据不丢失解决方案

    假设要更新TableC表,建议的做法是: 1) 将TableC重命名为TableC_temp SQL语句可以这样写:ALERT TABLE TableC RENAME TO TableC_temp; ...

随机推荐

  1. 《Qt编程的艺术》——8.2.1 在Designer中使用View类

    不幸的是,QDirModel有一个严重的限制:因为view不响应鼠标操作,我们不得不自己建立这些功能.除此之外,每个view中,用户都一次只能选择一个元素.如果你想要允许同时选择多个项目,你也必须自己 ...

  2. 10th day

    貌似有几天没写博客了额.... 现在学习MySQL数据库,难度并不是很大,只是需要记忆的知识点比较多,好多语法之类的,比较容易混淆,而且老师讲课的速度还是蛮快的,虽然部分同学觉得听起来有点吃力,不过我 ...

  3. Android FastJson解析

    1.导包 compile 'com.alibaba:fastjson:1.2.21' public static final Object parse(String text); // 把JSON文本 ...

  4. uva:10340 - All in All(字符串匹配)

    题目:10340 - All in All 题目大意:给出字符串s和t,问s是否是t的子串.s若去掉某些字符能和t一样,那么t是s的子串. 解题思路:匹配字符.t的每一个字符和s中的字符匹配.注意这里 ...

  5. redis 记录

    参考 :  http://keenwon.com/1275.html http://blog.csdn.net/freebird_lb/article/details/7733970 http://w ...

  6. PID38 串的记数(codevs2077)

    /* 假设当前有a个A b个B c个C 用 f[a][b][c]来表示 那么如果这个串以A结尾 那就是 f[a-1][b][c]转移来的 所以构成 f[a][b][c]的串一定有一部分是 f[a-1] ...

  7. codevs 最佳落点(模拟)

    /* 这题并没有A掉 自己电脑上运行ok提交就不对 预处理攻击范围 然后模拟 求大神看看有没有错误 Orz */ #include<iostream> #include<cstdio ...

  8. 关于电脑开机不出现桌面即不启动explorer.exe桌面程序--------正解

    针对这个问题,一开始的思路是,把自己写的界面小程序(Win.exe)放在Windows启动文件夹中, 效果到是界面程序自启动了,但是还是先出现的桌面,然后才的启动的界面程序(Win.exe),并不是我 ...

  9. DataTable去重复方法

    //去掉重复行 DataTable table=new DataTable(); DataView dv = table.DefaultView; table = dv.ToTable(true, n ...

  10. android6.0源码分析之Camera API2.0下的Capture流程分析

    前面对Camera2的初始化以及预览的相关流程进行了详细分析,本文将会对Camera2的capture(拍照)流程进行分析. 前面分析preview的时候,当预览成功后,会使能ShutterButto ...