一、升级(使用到onUpgrade()方法和onCreate()没有安装过才用到)

简单理一下思路:

 v1.0 (也就是说第一次使用这软件,没有安装过 所有在onCreate() 方法里写代码)
  1.没有安装过    onCreate() 

--------------------------------------
v2.0   [onUpgrade 情况:n-1,onCreate 情况:1]  (这是第二个版本,有两种可能的升级路线,第一条是从版本1到版本2,第二种是第一次安装【也相当于一次性从版本1到2】)
  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()  
-----------------------------------------
 
首先创建一个类MyDatabaseOpenHelper继承SQLiteOpenHelper并实现方法
 
先创建第一个版本的数据库(数据库名是mydata.db,版本是1)

因为是第一次所以在onCreate 里写添加表的代码(表名sql_message,有五列)

最后运行,然后在ddms里面的data分区下的data文件夹中找到生成的mydata.db数据库文件拷贝到d盘,如图

然后启动dos命令对mydata.db进行操作看能否查到我们刚刚添加的表

找到了 也相当于第一个版本只有表还没有添加数据 现在我们正式升级到2.0 也就是添加几条数据

那么根据前面的逻辑思路 我们是从1.0到2.0,所以需要在onUpgrade()方法里进行升级,代码如下:

先把版本改为2(也就是说新版本号是2,老版本是1)

升级(在 onUpgrade编写)

public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

//判断老版本是不是等于1(是的现在我们升级到2)
if (oldVersion == 1) {

//我表里添加三条数据
String sql_init_1 = "insert into t_message values (1,'abc','abc1','abcd1','hi1')";
String sql_init_2 = "insert into t_message values (2,'abc','abc2','abcd2','hi1')";
String sql_init_3 = "insert into t_message values (3,'abc','abc2','abcd2','hi1')";
db.execSQL(sql_init_1);
db.execSQL(sql_init_2);
db.execSQL(sql_init_3);
Log.i("db", "从1到2,升级成功!");  //提示语
}
}

最后运行然后又拿到mydata.db又在dos查询看

那如果用户从来没有安装过,第一次安装2.0版本(记住是1.0到2.0了哦) 就要在onCreate 里面写上创建表的代码和添加数据的代码 两个都要写哦,

public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
// 编写【从0开始到最新状态】建表语句
Log.i("hi", "没有数据库,创建数据库,创建v2.0成功");
String sql_message = "create table t_message " +"(id int primary key,tou1 varchar(50),userName varchar(50)," +"lastMessage varchar(50),datetime varchar(50))";   //创建表
String sql_init_1 = "insert into t_message values (1,'abc','abc1','abcd1','hi1')";   //添加数据
String sql_init_2 = "insert into t_message values (2,'abc','abc2','abcd2','hi1')";
String sql_init_3 = "insert into t_message values (3,'abc','abc2','abcd2','hi1')";
db.execSQL(sql_message);  //先执行创建表,再添加数据
db.execSQL(sql_init_1);
db.execSQL(sql_init_2);
db.execSQL(sql_init_3);
}

以此类推  如果要升级到好多版本的话就只需要在onUpgrade里判断老版本号来编写升级所改动的表结构 最后执行数据库操作,升级无非是对数据表的结构发生改变而已 来改变用户需求达到升级的

二、降级(onDowngrade()方法)

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

我们这里用到也是上面升级到3.0的版本,就是说将在2.0基础上添加多一列的3.0降回到2.0  上面我们没讲2.0如何升级到3.0(简单说就是多加一列)  现在有降到2.0

那么我们首先要保证我们的mydata.db是3.0的版本

版本改为2.0

在onDowngrade方法里写降级代码:

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";
String sql_message = "create table t_message (id int primary key,tou1 varchar(50),userName varchar(50),lastMessage varchar(50),datetime varchar(50))";
String sql_init_1 = "insert into t_message values (1,'abc','abc1','abcd1','hi1')";
String sql_init_2 = "insert into t_message values (2,'abc','abc2','abcd2','hi1')";
String sql_init_3 = "insert into t_message values (3,'abc','abc2','abcd2','hi1')";
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);
}
}

  

安卓在SQLiteOpenHelper类进行版本升级和降级的更多相关文章

  1. Android_SQLite版本升级,降级 管理

    今天我们主要学习了数据库版本升级对软件的管理操作. 我们手机经常会收到xxx软件升级什么的提醒,你的软件版本更新,同时你的数据库对应的版本也要相应的更新. 数据库版本更新需要主要的问题: 软件的1.0 ...

  2. Android:SQLiteOpenHelper类(SQLlite数据库操作)详细解析

    前言 SQLite数据库操作在Android开发中非常常用 今天我将带大家全面了解关于SQLite数据库的操作(增.删.查.改) 目录 1. SQLite数据库介绍 SQLite是Android内置的 ...

  3. Android笔记——SQLiteOpenHelper类

    public 抽象类 SQLiteOpenHelper 继承关系 Java.lang.Object android.database.sqlite.SQLiteOpenHelper 类概要 这是一个辅 ...

  4. Android中SQLiteOpenHelper类的onUpgrade方法浅谈

    public abstract void onUpgrade(SQLiteDatabase db,int oldVersion,int new Version) 这个方法在实现时需要重写. onUpg ...

  5. Android SQLiteOpenHelper类的使用

    SQLiteOpenHelper类是Android平台提供的用于SQLite数据库的创建.打开以及版本管理的帮助类.一般需要继承并这个类并实现它的onCreate和onUpgrade方法,在构造方法中 ...

  6. android SQLite使用SQLiteOpenHelper类对数据库进行操作

    android SQLite使用SQLiteOpenHelper类对数据库进行操作 原文: http://byandby.iteye.com/blog/835580

  7. Android之ListView动态添加数据(SQLiteOpenHelper类添加数据)

    一.SQLiteOpenHelper类: 这次我们通过sqlite来动态添加数据,接下来我们创建一个openHelper.java,在前面sqlite博客中我们已经详细的讲了SQLite的创建及使用等 ...

  8. Android中SQLite数据库操作(2)——SQLiteOpenHelper类

    如果开发者对SQL语法不熟悉,我要告诉你一个好消息,Android提供了一个SQLiteOpenHelper类. 在实际项目中很少使用SQLiteDatabase的方法(请看:http://blog. ...

  9. SQLiteOpenHelper类

    SQLiteOpenHelper是管理数据库的工具类. 下面提供一个模板: package com.example.intelligencecontrol.utils; import android. ...

随机推荐

  1. C# DateTime

    //c datetime 格式化DateTime dt = DateTime.Now;Label1.Text = dt.ToString();//2005-11-5 13:21:25Label2.Te ...

  2. imod报错:error while loading shared libraries: libjpeg.so.62的解决办法

    the file libjpeg.so.62(in /usr/lib/libjpeg.so.62)belongs to the package libjpeg62so try to reinstall ...

  3. HDU 4010.Query on The Trees 解题报告

    题意: 给出一颗树,有4种操作: 1.如果x和y不在同一棵树上则在xy连边 2.如果x和y在同一棵树上并且x!=y则把x换为树根并把y和y的父亲分离 3.如果x和y在同一棵树上则x到y的路径上所有的点 ...

  4. python3 遍历文件

    程序很简单,parent,dirnames,filenames分别表明当前目录下的文件夹数及文件数,然后通过os.wolk向深入遍历.   import os import os.path # thi ...

  5. Linux常用命令大全(2)

    系统信息arch 显示机器的处理器架构(1) uname -m 显示机器的处理器架构(2) uname -r 显示正在使用的内核版本 dmidecode -q 显示硬件系统部件 - (SMBIOS / ...

  6. python 图片压缩存储

    python(PIL)图像处理(等比例压缩.裁剪压缩) 缩略(水印)图 http://outofmemory.cn/code-snippet/12264/python-PIL-image-proces ...

  7. tomcat架构分析-索引

    出处:http://gearever.iteye.com tomcat架构分析 (概览) tomcat架构分析 (容器类) tomcat架构分析 (valve机制) tomcat架构分析 (valve ...

  8. iOS - 正则表达式判断邮箱、身份证..是否正确:

    iOS - 正则表达式判断邮箱.身份证..是否正确: //邮箱 + (BOOL) validateEmail:(NSString *)email {     NSString *emailRegex ...

  9. Unity问答——怎么知道屏幕中目前有多少个敌人?

    这篇博客源自我在泰课在线的回答.链接:http://www.taikr.com/group/1/thread/92 问:怎么知道屏幕中目前有多少个敌人? 答: 思路一:仅适用于2D游戏,因为这个方法没 ...

  10. Entity Framework OData filter inherit

    过滤继承对象 TPH 的情况 EF : return Task.FromResult<IQueryable<Parent>>( query.OfType<ChildA&g ...