数据库版本升级

在开发android应用程序的时候,一般由于在我们开发的时候我们不知道以后会后什么新功能,也有可能增加业务逻辑(也就是更新),可想而知我们原来的数据库结构可能不适用已更新的应用,那么应用在读取旧数据的时候可能就会出现问题;解决上面问题的方法有如下两种:

1.卸载旧版本,安装新的应用程序

备注:这样做有一点不好就是原来的数据就丢失了;

2.软件自行更新数据库结构(接下来就介绍软件自行更新方法)

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

1 packagecom.example.database;2

3 importandroid.content.Context;4 importandroid.database.sqlite.SQLiteDatabase;5 importandroid.database.sqlite.SQLiteDatabase.CursorFactory;6 importandroid.database.sqlite.SQLiteOpenHelper;7 importandroid.util.Log;8 importandroid.widget.Toast;9

10 public class myDatabase extendsSQLiteOpenHelper{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 privateContext mContext;20

21

22 publicmyDatabase(Context context) {23 super(context, "BookStore.db", null,1); //数据库版本为124 mContext =context;25 }26

27

28 /*数据库第一次创建时调用,适合用于初始化,创建表 当数据库已存在则不调用该方法*/

29 @Override30 public voidonCreate(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 @Override38 public void onUpgrade(SQLiteDatabase db, int oldVersion, intnewVersion) {39

40 }41

42 }

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

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

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

1 @Override2 public void onUpgrade(SQLiteDatabase db, int oldVersion, intnewVersion) {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 @Override2 public void onUpgrade(SQLiteDatabase db, int oldVersion, intnewVersion) {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 @Override2 public void onDowngrade(SQLiteDatabase db, int oldVersion, intnewVersion) {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 }

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

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

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

  2. android 保存文件_Android 数据库操作框架LitePal使用介绍(一)

    在Android开发中,前端开发很多情况数据都是从服务器端获取的,使用本地数据库的情况可能不会太常见.有一些需要本地保存的配置数据,也是使用Hawk框架等本地缓存框架进行保存.但是对于如果是一些需要本 ...

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

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

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

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

  5. 如何把SQLServer数据库从高版本降级到低版本?

    原文: 如何把SQLServer数据库从高版本降级到低版本? 由于目前还广泛使用着SQLServer2000,很多公司又想使用新的SQLServer,从而直接[分离/附加]或者[备份/还原]数据库,在 ...

  6. 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 ...

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

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

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

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

  9. 红米Android降级,红米Note 5(安卓9.0 不要降级刷低版本)纯净ROOT线刷包分享,一键救砖教程,轻松刷回官方系统,流畅如初!...

    红米Note 5(安卓9.0 不要降级刷低版本)纯净ROOT线刷包分享,一键救砖教程,轻松刷回官方系统,流畅如初! 发布日期:2019-05-06   来源:互联网   编辑:lanxi 红米Note ...

最新文章

  1. AbstractBeanDefinition:lenientConstructorResolution属性源码分析
  2. C#获取当前进程、项目路径的方法
  3. libvirt 启动 qemu 的过程
  4. Hibernate @OneToMany 及 @Cascade级联操作
  5. 利用python进行数据分析_资料 | 利用Python进行数据分析
  6. 根据需要通过代码的方式加载js文件
  7. 创造型模式——建造者模式
  8. QT开发及实例学习之六控件
  9. 使用Presto SQL一些常见问题总结
  10. almost a hero 差不多英雄 攻略
  11. ROS里程计的学习(odometry) (二)
  12. 2020神舟几号发射_神舟九号和神舟十号是什么时候发射的,宇航员分别是谁?...
  13. ZZULIOJ--2825: 收集金币
  14. 嵌入式软件工程师对linux要求,嵌入式软件工程师的必备知识
  15. 从0到1亿美元 ---- PopCap创始人John Vechey自述
  16. 快速理解论文主旨框架:论文十问法
  17. Python的pep8(代码规范)
  18. 企业微信怎么统计客户数量
  19. 拓客必备神器:采集工具让你的数据采集更快更准
  20. python ocr中文训练_cnocr: cnocr是用来做中文OCR的Python 3包。cnocr自带了训练好的识别模型,安装后即可直接使用...

热门文章

  1. 11月1日数据结构讨论班 【杂】
  2. iOS:切换视图的第三种方式:UITabBarController标签栏控制器
  3. 一些实用的mysql语句(不断积累更新)
  4. 浅谈我对JCS 的理解
  5. android 强制设置横屏 判断是横屏还是竖屏
  6. puppet安装与配置
  7. 不要对对象进行粗暴的等号赋值
  8. Android中解决debug.keystore到期的问题
  9. Asp.net 操作cookie大全
  10. python pip 安装错误 EnvironmentError: mysql_config not found