数据库版本升级

在开发android应用程序的时候,一般由于在我们开发的时候我们不知道以后会后什么新功能,也有可能增加业务逻辑(也就是更新),可想而知我们原来的数据库结构可能不适用已更新的应用,那么应用在读取旧数据的时候可能就会出现问题;解决上面问题的方法有如下两种:
  1.卸载旧版本,安装新的应用程序
            备注:这样做有一点不好就是原来的数据就丢失了;
       2.软件自行更新数据库结构(接下来就介绍软件自行更新方法)

    首先我们新建一个项目并初始化数据库(此时数据库版本为1.0)

       1 package com.example.database; 2

 import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
import android.widget.Toast; public class myDatabase extends SQLiteOpenHelper{ public static final String CREATE_BOOK = "create table book("
+"id integer primary key autoincrement,"
+"author text,"
+"price real,"
+"pages integer,"
+"name text)"; private Context mContext; public myDatabase(Context context) {
super(context, "BookStore.db", null,); //数据库版本为1
mContext = context;
} /*数据库第一次创建时调用,适合用于初始化,创建表 当数据库已存在则不调用该方法*/
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREATE_BOOK);
db.execSQL("insert into book(author, name) values('asd','asdddas')"); Toast.makeText(mContext, "Create succeeded", Toast.LENGTH_SHORT).show();
} @Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { } }

运行项目后我们导出它的数据库文件并查看相关信息

  

    如何在  版本 1 的基础上升级呢  看下面代码

      

 public myDatabase(Context context) {
super(context, "BookStore.db", null, 2); //首先改版本号
mContext = context;
}
 @Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
if(oldVersion==1){
db.execSQL("alter table book add column addres varchar(20)"); /*onUpagrade 用数据库升级 我们这这段代码加入到项目中*/
Log.i("db", "从1升到2成功");
}
}

      运行程序然后导出数据库文件查看信息

    

      也有一种情况,就是说现在最新是版本3,但是旧版本有可能1,也有可能是2怎么解决和上面类似依次写下去

        我们把版本号改为3,onUpagrade代码如下

          

 @Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
if(oldVersion==2){
db.execSQL("create table test(id int primary key autoincrement,name varchar(20) )");
Log.i("db", "从2升到3");
}
if(oldVersion==1){
db.execSQL("alter table book add column addres varchar(20)");
db.execSQL("create table test(id int primary key autoincrement,name varchar(20) )");
Log.i("db", "从1升到3");
} }

  这里就不展示了,当我们有更的版本时也要考虑掉到各个版本的最新版本的升级,虽然和麻烦。如果用真机测试可在手机上下载一个    sqlite 编辑器 查看相关数据库信息不过手机必须root.


降级的设计关键点

  1.考虑云端要保存用户【自定义数据,行为习惯】,专业 术语profile--》》提高用户黏度
  2.考虑 【当前】的最低版本要求--》》降低维护成本
  3.尽可能本地的转移数据(所有新版本,都不删除字段)--》尽可能吧未知变为已知
     try catch;

  上面我们 已经把版本升到3.0l ,那么下面将解析如何把3.0降级到2.0;(别忘了吧version改成2)

    

 @Override
public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) { //老版本为3.0
if(newVersion==2){
/*从上面的可以看出3.0版本就比2.0版本其实只多了一张表,book表的字段也没有变,那么要降级的话我们只需要删除test表就行,这里就不解析了*/
//db.execSQL("drop table test");
/*如果我们 book的数据在第三个版本的时候改了 ,那么我们要的只是回到第二个版本,那么第二个版本里面book里面
与第3个版本里面相同字段的数据肯定要传过来,那么我们的方法肯定不能是直接删除不然数据会丢失,这里将主要讲*/ try { //第一步 吧版本三里面的book,先备份改名
db.execSQL("alter table book rename to book_baup");
//第一步 吧版本三里面的book,先备份改名 //第二步建立2.0book表的表结构
db.execSQL(CREATE_BOOK); //CREATE_BOOK 创建表的字段在上面有个全局变量
Log.i("down", "2.建立2.0表结构成功"); //把备份的数据copy到新建的表
db.execSQL("insert into book select author,name,price,pages from book_baup");
Log.i("down", "3.copy到用户数据到 2.0的表"); //把备份的数据删除
db.execSQL("drop table book_baup");
Log.i("down", "4.把备份表drop掉");
} catch (SQLException e) {
//直接删除 重建表再插入数据包括在3.0版本中对2.0版本book表字段修改的数据
db.execSQL("drop table book"); db.execSQL(CREATE_BOOK);
db.execSQL("insert into book(author, name) values('asd','asdddas')"); } } }

    

  

android——数据库版本升/降级问题的更多相关文章

  1. Android数据库升级、降级、创建(onCreate() onUpgrade() onDowngrade())[4]

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

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

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

  3. Android 数据库读取数据显示 [5]

    2016-12-1 课程内容 昨天学了Android数据库升级.降级.创建 今天把数据库表里面的数据读取出来显示到手机屏幕上 下面代码是MainActivity.java 的代码 package co ...

  4. Android笔记——数据库升级与降级

    一.概述 SQLite是Android内置的一个很小的关系型数据库.SQLiteOpenHelper是一个用来辅助管理数据库创建和版本升级问题的抽象类.我们可以继承这个抽象类,实现它的一些方法来对数据 ...

  5. Android之数据库升级onUpgrade降级onDowngrade

    借用API文档解释: public abstract void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) 当数据库需要升 ...

  6. Android版本更新时对SQLite数据库升级或者降级遇到的问题

    SQLite是Android内置的一个很小的关系型数据库.SQLiteOpenHelper是一个用来辅助管理数据库创建和版本升级问题的抽象类.我们可以继承这个抽象类,实现它的一些方法来对数据库进行自定 ...

  7. Android之sqlite数据库版本升级和降级的处理(onUpgrade和onDowngrade)

    一.SQLite升级和降级需要考虑的细节 ①  SQLite升级: v3.0数据库版本 [onUpgrade 情况:n-1,onCreate 情况:1]                        ...

  8. 在Android中afinal框架下實現sqlite數據庫版本升級的辦法

    public abstract void onUpgrade(SQLiteDatabase db,int oldVersion,int new Version) 這個方法在實現時需要重寫.   pub ...

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

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

随机推荐

  1. python之platform模块

    python之platform模块 ^_^第三个模块从天而降喽!! 函数列表 platform.system() 获取操作系统类型,windows.linux等 platform.platform() ...

  2. sublime text3 前端插件介绍

    Emmet插件 Emmet插件可以说是使用Sublime Text进行前端开发必不可少的插件 它让编写HTML代码变得极其简单高效 基本用法:输入标签简写形式,然后按Tab键 关于Emmet的更多介绍 ...

  3. Java_File类讲解_打印目录树状结构_递归算法

    package cn.xiaocangtian.testFile; import java.io.File; public class FileTree { public static void ma ...

  4. Redsi和Memcached区别总结

    首先谈谈Redis和Memcached它们都是缓存在内存中的,唯一的区别就是Redis它本身会周期性的把 更新的一些数据写入到磁盘或者修改操作写入追加的记录文件中,并且在此基础上实现master-sl ...

  5. wireshark使用方法总结

    Wireshark基本用法 抓取报文: 下载和安装好Wireshark之后,启动Wireshark并且在接口列表中选择接口名,然后开始在此接口上抓包.例如,如果想要在无线网络上抓取流量,点击无线接口. ...

  6. Mac下的类似apt-get的包管理工具Homebrew(笔记)

    对于一个习惯了在 Ubuntu 的终端上通过 apt-get 来安装工具软件的我来说,也希望在Mac上找到类似的工具,能很方便的一条命令就能安装所需的软件,而不用手工的去查找下载编译,或者是折腾安装所 ...

  7. 组合模式/composite模式/对象结构型模式

    组合模式/composite模式/对象结构型 意图 将对象组合成树形结构以表示"整体--部分"的层次结构.Composite使得用户对单个对象和组合对象的使用具有一致性. 动机 C ...

  8. JQuery的无缝滚动

    图片无缝向左滚动的代码如下:   <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "h ...

  9. Web.xml配置参数详解

    1 定义头和根元素 部署描述符文件就像所有XML文件一样,必须以一个XML头开始.这个头声明可以使用的XML版本并给出文件的字符编码.DOCYTPE声明必须立即出现在此头之后.这个声明告诉服务器适用的 ...

  10. 安装Hive(独立模式 使用mysql连接)

    安装Hive(独立模式 使用mysql连接) 1.默认安装了java+hadoop 2.下载对应hadoop版本的安装包 3.解压安装包 tar zxvf apache-hive-1.2.1-bin. ...