一、升级(使用到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. 【POJ3243】【拓展BSGS】Clever Y

    Description Little Y finds there is a very interesting formula in mathematics: XY mod Z = K Given X, ...

  2. html5 DeviceOrientation来实现手机网站上的摇一摇功能

    原文地址:http://www.cootm.com/?p=706 从网上转载看到的,感觉不错,就转过来了,特此感谢 cnblogs 的 幸福2胖纸的码农生活,直接转载了,不要介意!呵呵 以下是转载内容 ...

  3. Flask-SQLALchemy查询

    from: http://blog.sina.com.cn/s/blog_633277f90100kpvm.html 似乎ORM最难设计的部分是查询.特别是面向对象的查询,今天学习SQLAlchemy ...

  4. Jquery 简单的Tab选项卡特效

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  5. django-orm-standalone

    django-orm-standalone script via:https://github.com/masnun/django-orm-standalone/ # Django specific ...

  6. windows live writer 下载及安装

    windowslive writer下载地址: http://www.microsoft.com/en-us/download/details.aspx?id=8621(不知为啥,这里我无法下载)或 ...

  7. android studio集成环境搭建

    1 下载JDK(http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html)      An ...

  8. 3、MyBatis.Net学习笔记之增删改

    增删改之前先说一下笔记1里提到的一个无法创建ISqlMapper对象的问题. <resultMaps> <resultMap id="FullResultMap" ...

  9. 2、MyBatis.NET学习笔记之CodeSmith使用

    说明:本系列随笔会与CSDN同步发布,当然这里先发,因为这里可以用WLW.但刚才由于误操作,没有重新发上来.只好先在CSDN先发了.重往这里发时图片无法处理,索性直接粘过来吧! 使用框架后一些相关的配 ...

  10. Catharanthus roseus(长春花碱)的生物合成

    标题:Directed Biosynthesis of Alkaloid Analogs in the Medicinal Plant Catharanthus roseus 作者:Elizabeth ...