数据库版本升级

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

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

       1 package com.example.database; 2

 3 import android.content.Context;
 4 import android.database.sqlite.SQLiteDatabase;
 5 import android.database.sqlite.SQLiteDatabase.CursorFactory;
 6 import android.database.sqlite.SQLiteOpenHelper;
 7 import android.util.Log;
 8 import android.widget.Toast;
 9
10 public class myDatabase extends SQLiteOpenHelper{
11
12     public static final String CREATE_BOOK = "create table book("
13             +"id integer primary key autoincrement,"
14             +"author text,"
15             +"price real,"
16             +"pages integer,"
17             +"name text)";
18
19     private Context mContext;
20
21
22     public myDatabase(Context context) {
23         super(context, "BookStore.db", null, 1);  //数据库版本为1
24         mContext = context;
25         }
26
27
28     /*数据库第一次创建时调用,适合用于初始化,创建表 当数据库已存在则不调用该方法*/29     @Override
30     public void onCreate(SQLiteDatabase db) {
31         db.execSQL(CREATE_BOOK);32         db.execSQL("insert into book(author, name) values('asd','asdddas')");
33
34         Toast.makeText(mContext, "Create succeeded", Toast.LENGTH_SHORT).show();
35     }
36
37     @Override
38     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
39
40     }
41
42 }

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

  

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

      

1 public myDatabase(Context context) {
2         super(context, "BookStore.db", null, 2);   //首先改版本号
3         mContext = context;
4         }

1 @Override
2     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
3         if(oldVersion==1){
4             db.execSQL("alter table book add column addres varchar(20)");    /*onUpagrade 用数据库升级   我们这这段代码加入到项目中*/
5             Log.i("db", "从1升到2成功");
6         }
7     }

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

    

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

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

          

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

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

降级的设计关键点

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

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

    

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

    

  

转载于:https://www.cnblogs.com/mark0812/p/6118350.html

android——数据库版本升/降级问题相关推荐

  1. android数据库降级_android——数据库版本升/降级问题

    数据库版本升级 在开发android应用程序的时候,一般由于在我们开发的时候我们不知道以后会后什么新功能,也有可能增加业务逻辑(也就是更新),可想而知我们原来的数据库结构可能不适用已更新的应用,那么应 ...

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

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

  3. android数据库降级_Android 数据库版本降低时的操作

    最近在开发中遇到一个问题,当数据库做了升级之后,卸载掉新版本APP,重新安装旧版本APP.旧版本APP不能正常工作. 具体问题描述和原因 首先注意这里有两个版本,一是APP的版本,二是APP中数据库的 ...

  4. android数据库降级_Android SQLite (二.数据库创建,升级及降级)

    上篇文章简介和常用语法介绍了SQLite数据库的基本信息和一些常用的语法操作,本篇文章主要介绍Android开发过程中SQLite数据库的创建使用和常见问题处理. 一.SQLiteOpenHelper ...

  5. mysql 5.6升级8.0_Mysql数据库从5.6.28版本升到8.0.11版本部署项目时遇到的问题及解决方法...

    MysqL数据库版本从5.6.28升到8.0.11过程中部署项目时遇到的问题和解决方法,具体介绍如下所示: 首先这个项目用到了hibernate4.2.0,链接MysqL5.6.28没问题,换到8.0 ...

  6. android数据库升级兼容老版本吗,成功升级后Android升级数据库不更新数据库版本...

    我想添加三个新表到我现有的sqlite数据库,我遇到了成功升级后不更新数据库版本的问题.下面是运行DatabaseHelper:成功升级后Android升级数据库不更新数据库版本 private st ...

  7. Mysql数据库从5.6.28版本升到8.0.11版本部署项目时遇到的问题及解决方法

    这篇文章主要介绍了Mysql数据库从5.6.28版本升到8.0.11版本过程中遇到的问题及解决方法,解决办法有三种,每种方法给大家介绍的都很详细 mysql数据库版本从5.6.28升到8.0.11过程 ...

  8. Android数据库高手秘籍(九),赶快使用LitePal 2.0版本吧

    转载请注明出处:https://blog.csdn.net/guolin_blog/article/details/80586028 本文同步发表于我的微信公众号,扫一扫文章底部的二维码或在微信搜索 ...

  9. android 覆盖安装数据库版本冲突,Android覆盖安装及常遇到的问题

    Android 覆盖安装 a. 覆盖安装apk文件后,shared_prefs中的数据不会丢失,数据库表中的数据也不会丢失. b. 升级数据库的方法 public void onUpgrade(SQL ...

最新文章

  1. 中秋节前,送一波福利
  2. 在Android中使用Handler和Thread线程执行后台操作
  3. html5网页代码模板简单,简洁蓝色风格HTML5网页模板
  4. 进程控制块PCB(进程描述符)
  5. 内存管理检查方法和工具
  6. linux创建磁盘pv报错,Linux 磁盘管理
  7. IE浏览器不能上网的处理办法
  8. 新学期,对同学们的要求和期望
  9. 实现一个二叉树层级遍历_算法总结:左神class5—二叉树递归和非递归实现遍历(后序用一个栈彩蛋)...
  10. 使用NanoHttpd实现简易WebServer
  11. 详解SSTI模板注入
  12. 制造业信息化的伴侣---Windows 2016超融合
  13. 怎么起一个好听的商务邮箱名字?
  14. rk板子linux系统安装rga,drm,mpp
  15. 100句充满智慧的人生格言
  16. 佳博80系列小票打印机 gp 80180安装驱动,显示打印错误
  17. 【NOI2008】 糖果雨
  18. 给文本设置下划线或者删除线
  19. Vue 表情包输入组件
  20. BoxCutter:阵列

热门文章

  1. jquery选择器之基本选择器
  2. a form 出口享惠情况_次磷酸8类危险品海运出口
  3. [leetcode周赛]1346. 检查整数及其两倍数是否存在
  4. 判断是否是完全二叉树和是否为满二叉树
  5. OpenGL基础43:抗锯齿
  6. bzoj 3369: [Usaco2004 Feb]Pesky Parentheses 烦人括号(思维题)
  7. bzoj 3119: Book(构造)
  8. bzoj 3798: 特殊的质数(分块打表)
  9. 大津二值化算法 ( Otsu's binarization ) 自动确定二值化图像时的阈值
  10. Java中输出流重定向小例子