Andoird的SQLiteOpenHelper类中有一个onUpgrade方法。

  1. 帮助文档里说的“数据库升级”是指什么?
    你开发了一个应用,当前是1.0版本。该程序用到了数据库。到1.1版本时,你在数据库的某个表中增加了一个字段。那么软件1.0版本用的数据库在软件1.1版本就要被升级了(当然这里的升级包括两个概念,一个是应用升级还有就是数据库升级)。

  2. 数据库升级应该注意什么?

    软件的1.0版本升级到1.1版本时,数据库中老的数据不能丢。那么在1.1版本的应用中就要有地方能够检测出来新的数据库与老的数据库不兼容。并且能够有办法把1.0应用中的数据库升级到1.1应用时能够使用的数据库。换句话说,要在1.0应用的数据库中的那个表中增加那个字段,并赋予这个字段默认值。

  3. 应用如何知道数据库需要升级?
    SQLiteOpenHelper类的构造函数有一个参数是int version,它的意思就是指数据库版本号。比如在应用1.0版本中,我们使用
SQLiteOpenHelper访问数据库时,该参数为1,那么数据库版本号1就会写在我们的数据库中。到了1.1版本,我们的数据库需要发生变化,那么我们1.1版本的程序中就要使用一个大于1的整数来构造SQLiteOpenHelper类,用于访问新的数据库,比如2。当我们的1.1新程序读取1.0版本的老数据库时,就发现老数据库里存储的数据库版本是1,而我们新程序访问它时填的版本号为2,系统就知道数据库需要升级。

  4、

    一、软件v1.0

      安装v1.0,假设v1.0版本只有一个account表,这时走继承SQLiteOpenHelper的onCreate,不走onUpgrade。

      1、v1.0(直接安装v1.0)

    二、软件v2.0

      有2种安装软件情况:

      1、v1.0   -->  v2.0              不走onCreate,走onUpgrade

      2、v2.0(直接安装v2.0)          走onCreate,不走onUpgrade

      v1.0版本只有一个account表,软件版本升级到v2.0了,但是v2.0数据库需要新增一个member表,那怎么办呢?这里有2种情况了:一种是安装了v1.0升级到v2.0,这时不会走继承SQLiteOpenHelper的onCreate,而是直接走onUpgrade,这时就要在onUpgrade添加member表的代码了,在onCreate加了也没用,因为这种情况都不走onCreate。。另一种情况就是用户从来没有安装过这个软件,直接安装v2.0,这时走继承SQLiteOpenHelper的onCreate,不走onUpgrade,所以要在onCreate添加member表的代码。这怎么办呢?这就要合理升级数据库版本了。

    三、软件v3.0

      假设v3.0又新增一个news表,这里有三种情况:

      1、v1.0   -->  v3.0              不走onCreate,走onUpgrade

      2、v2.0   -->  v3.0              不走onCreate,走onUpgrade

      3、v3.0(直接安装v3.0)          走onCreate,不走onUpgrade

  简单实例

  1、建立一个android项目,添加一个类继承SQLiteOpenHelper类

  2、先写一个1.0版本的,代码如下

public class Openhelp extends SQLiteOpenHelper {
//创建数据库
private static final String DB_NAME="Text.db";
//数据库版本
private static final int version=1;
public Openhelp(Context context) {
super(context,DB_NAME,null,version); }
//创建表
@Override
public void onCreate(SQLiteDatabase db) {
Log.i("hi", "没有数据库,创建数据库"); String sql="create table t_message (userName varchar(50),message varchar(50),datetime varchar(50))"; db.execSQL(sql); Log.i("h1","1.0建立成功");//以日志输出
}
//更新
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}

  

  更新为2.0版本,onUpgrade方法

public class Openhelp extends SQLiteOpenHelper {
//创建数据库
private static final String DB_NAME="Text.db";
//数据库版本
private static final int version=;
public Openhelp(Context context) {
super(context,DB_NAME,null,version); }
//创建表
@Override
public void onCreate(SQLiteDatabase db) {
Log.i("hi", "没有数据库,创建数据库");
//直接更新到2.0版本
String sql="create table t_message (userName varchar(50),message varchar(50),datetime varchar(50))";
String sql_1="insert into t_message values('小王','你好','11-25')";
String sql_2="insert into t_message values('小过','你好','11-26')";
String sql_3="insert into t_message values('小李','你好','11-24')";
db.execSQL(sql);
db.execSQL(sql_1);
db.execSQL(sql_2);
db.execSQL(sql_3);
Log.i("h1","2.0");
}
//更新
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { if(oldVersion==){ String sql="insert into t_message values('小李','你好','11-24')";
String sql_1="insert into t_message values('小王','你好','11-25')";
String sql_2="insert into t_message values('小过','你好','11-26')";
db.execSQL(sql);
db.execSQL(sql_1);
db.execSQL(sql_2);
Log.i("hi","1.0到2.0更新成功");
}
}

  在更新到3.0的版本,也是使用onUpgrade方法

public class Openhelp extends SQLiteOpenHelper {
//创建数据库
private static final String DB_NAME="Text.db";
//数据库版本
private static final int version=3;
public Openhelp(Context context) {
super(context,DB_NAME,null,version); }
//创建表
@Override
public void onCreate(SQLiteDatabase db) {
Log.i("hi", "没有数据库,创建数据库");
//直接更新到3.0版本
String sql="create table t_message (userName varchar(50),message varchar(50),datetime varchar(50),gender varchar(4))";
String sql_1="insert into t_message values('小王','你好','11-25','男')";
String sql_2="insert into t_message values('小过','你好','11-26','男')";
String sql_3="insert into t_message values('小李','你好','11-24','男')";
db.execSQL(sql);
db.execSQL(sql_1);
db.execSQL(sql_2);
db.execSQL(sql_3);
Log.i("h1","3.0成功");
}
//更新
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
//版本2更新到3版本
if(oldVersion==2){
String sql_add="alter table t_message add column gender varchar(4)";
db.execSQL(sql_add);
Log.i("hi","2.0到3.0成功");
}
//版本从1更新到3版本
if(oldVersion==1){
String sql_add="alter table t_message add column gender varchar(4)";
db.execSQL(sql_add);
String sql="insert into t_message values('小李','你好','11-24','男')";
String sql_1="insert into t_message values('小王','你好','11-25','男')";
String sql_2="insert into t_message values('小过','你好','11-26','男')";
db.execSQL(sql);
db.execSQL(sql_1);
db.execSQL(sql_2);
Log.i("hi","1.0到3.0更新成功");
}
}

  

   降版本,从3.0版本到2.0版本,onDowngrade方法和onUpgrade方法运用差不多

  

package list;

import android.content.Context;
import android.database.DatabaseErrorHandler;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log; public class Openhelp extends SQLiteOpenHelper {
//创建数据库
private static final String DB_NAME="Text.db";
//数据库版本
private static final int version=2;
public Openhelp(Context context) {
super(context,DB_NAME,null,version); }
//创建表
@Override
public void onCreate(SQLiteDatabase db) {
Log.i("hi", "没有数据库,创建数据库");
//直接更新到3.0版本
String sql="create table t_message (userName varchar(50),message varchar(50),datetime varchar(50),gender varchar(4))";
String sql_1="insert into t_message values('小王','你好','11-25','男')";
String sql_2="insert into t_message values('小过','你好','11-26','男')";
String sql_3="insert into t_message values('小李','你好','11-24','男')";
db.execSQL(sql);
db.execSQL(sql_1);
db.execSQL(sql_2);
db.execSQL(sql_3);
Log.i("h1","3.0成功");
}
//更新
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
//版本2更新到3版本
if(oldVersion==2){
String sql_add="alter table t_message add column gender varchar(4)";
db.execSQL(sql_add);
Log.i("hi","2到3成功");
}
//版本从1更新到3版本
if(oldVersion==1){
String sql_add="alter table t_message add column gender varchar(4)";
db.execSQL(sql_add);
String sql="insert into t_message values('小李','你好','11-24','男')";
String sql_1="insert into t_message values('小王','你好','11-25','男')";
String sql_2="insert into t_message values('小过','你好','11-26','男')";
db.execSQL(sql);
db.execSQL(sql_1);
db.execSQL(sql_2);
Log.i("hi","1.0到3.0更新成功");
}
}
//降级
@Override
public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) {
try {
//改表名
String table="alter table t_message rename to t_message_back";
db.execSQL(table);
Log.i("hi","修改表名成功");
//建立2.0表结构
String sql_1="create table t_message (userName varchar(50),message varchar(50),datetime varchar(50))";
db.execSQL(sql_1);
Log.i("hi","建立成功");
//copy
String sql_2="insert into t_message select userName,message,datetime from t_message_back";
db.execSQL(sql_2);
Log.i("hi","成功copy");
//删除备份表
String sql_3="drop table if exists t_message_back";
db.execSQL(sql_3);
Log.i("hi","drp");
Log.i("hi","版本从3.0降到2.0版本");
}
catch (Exception e) {
//失败
Log.i("hi","失败,重新建立2.0版本");
//删除表
String sql="drop table if exists t_message";
//重新建立表
String sql_1="create table t_message (userName varchar(50),message varchar(50),datetime varchar(50))";
String sql_2="insert into t_message values('小王','你好','11-25')";
String sql_3="insert into t_message values('小过','你好','11-26')";
String sql_4="insert into t_message values('小李','你好','11-24')";
db.execSQL(sql);
db.execSQL(sql_1);
db.execSQL(sql_2);
db.execSQL(sql_3);
db.execSQL(sql_4);
}
}
}

  

  就是这样,无论v1.0升级到v3.0,或者v2.0升级到3.0,还是v3.0直接安装,安装后的v3.0数据库结构都是一样的,理解透彻就是好

android开发--数据库(更新或者降低版本)的更多相关文章

  1. Android开发数据库之第三方ORM框架(GreenDao)

    移动APP追求追求功能实现的同一时候,用户体验很重要.開始APP的同一时候.要时刻的切换开发人员的角色,如你开发的时候.是 站在APP的开发角色,处于生产者的位置:当你測试的时候.你应该把自己放在用户 ...

  2. Android开发数据库三层应用-DataSnap

    Android开发数据库三层应用-DataSnap http://www.2ccc.com/news/Html/?1517.html 核心提示:我觉得Delphi最强大的的功能之一就是开发数据库三层应 ...

  3. Android开发学习总结——搭建最新版本的Android开发环境

    原文出自:https://www.cnblogs.com/xdp-gacl/p/4322165.html#undefined 最近由于工作中要负责开发一款Android的App,之前都是做JavaWe ...

  4. Android开发-自动更新

    为车机写apk,先实现版本的自动更新. 1.不能再主线程中调用会阻塞ui的功能,需要使用异步方式调用网络,引入Android Async Http框架,需要两个包:android-async-http ...

  5. android开发学习 ------- debug 和 release版本执行结果不同

    在debug上测试成功的,release上测试不成功,就想着怎么将 release 版本进行调试一下.还好 Android Studio 3.0是可以进行调试apk的 可以显示log,自己看自己的逻辑 ...

  6. Android开发——子进程更新UI

    方式一:Handler和Message ① 实例化一个Handler并重写handlerMessage()方法 private Handler handler = newHandler() { pub ...

  7. [安卓开发板]迅为IMX6 四核Android开发板

    工业级核心板-Android开发板 10层高速PCB设计,充分保证电磁兼容 处理器:开发板默认是四核商业扩展级芯片,可根据用户需求更换单核.双核.工业级.汽车级处理器,批量更省成本. 扩展引脚:320 ...

  8. ios开发数据库版本迁移手动更新迭代和自动更新迭代艺术(二)

    由于大家都热衷于对ios开发数据库版本迁移手动更新迭代和自动更新迭代艺术(一)的浏览下面我分享下我的源文件git仓库: 用法(这边我是对缓存的一些操作不需要可以省去):https://github.c ...

  9. Android开发面试经——4.常见Android进阶笔试题(更新中...)

      Android开发(29)  版权声明:本文为寻梦-finddreams原创文章,请关注:http://blog.csdn.net/finddreams 关注finddreams博客:http:/ ...

随机推荐

  1. SQL Server 诊断查询-(5)

    Query #57 Buffer Usage -- Breaks down buffers used by current database by object (table, index) in t ...

  2. TYVJ P1023 奶牛的锻炼 Label:dp

    背景 USACO 描述 奶牛Bessie有N分钟时间跑步,每分钟她可以跑步或者休息.若她在第i分钟跑步,可以跑出D_i米,同时疲倦程度增加1(初始为0).若她在第i分钟休息,则疲倦程度减少1.无论何时 ...

  3. Eclipse快捷键 10个最有用的快捷键---摘录

    55 48 Eclipse中10个最有用的快捷键组合  一个Eclipse骨灰级开发者总结了他认为最有用但又不太为人所知的快捷键组合.通过这些组合可以更加容易的浏览源代码,使得整体的开发效率和质量得到 ...

  4. Effective Java之并发

    并发本身有两个概念:1.互斥性:2.可见性: 先来说一下可见性,就是让共享的变量在进程间可以及时获得最新版本的数据:这里比较简单的方式是为可能被并发修改的全局变量添加上volatile关键字:vola ...

  5. HDU - 2680 最短路 spfa 模板

    题目链接http://acm.hdu.edu.cn/showproblem.php?pid=2680 题目大意,就是一个人可以从多个起点开始出发,看到终点的最短路是多少..只有可以运用和hdu2066 ...

  6. HDU5983Pocket Cube

    Pocket Cube Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Tota ...

  7. eclipse中maven本地库和远程阿里库的配置

    很久没有写博客了,最近比较闲将最近学的和遇到的问题做一个备忘 1.eclipse中maven本地库的配置 如果只是下载和安装了maven没有指定maven本地库的位置,maven的默认的本地库在c:/ ...

  8. spfa 单源最短路究极算法

    学习博客链接:SPFA 求单源最短路的SPFA算法的全称是:Shortest Path Faster Algorithm.     SPFA算法是西南交通大学段凡丁于1994年发表的.    从名字我 ...

  9. Jboss Jmx-Console和 Jboss web-console安全设置

    1.介绍 如果你暴露你的JBoss服务器通过网络(如通过启动服务器使用选项B 0.0.0.0或者通过改变jboss.bind.address首次出现0.0.0.0在.../jboss/server/d ...

  10. SQL SERVER中查询某个表或某个索引是否存在

    查询某个表是否存在: 在实际应用中可能需要删除某个表,在删除之前最好先判断一下此表是否存在,以防止返回错误信息.在SQL SERVER中可通过以下语句实现: IF OBJECT_ID(N'表名称', ...