zoukankan      html  css  js  c++  java
  • android——数据库版本升/降级问题

    数据库版本升级

    在开发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     }

         

      

  • 相关阅读:
    [转]oracle 12c 中的分页子句
    display:table; 也可以实现 div 始终和内包的图片大小相同
    mongodb与SQL常见语句对照
    js生成验证码
    javascript 判断空数组
    网络绘制插件
    mongodb中查询返回指定字段
    Mybatis获取插入记录的自增长ID
    mysql 创建索引和删除索引
    Java 中 HashMap 初始化时赋值
  • 原文地址:https://www.cnblogs.com/mark0812/p/6118350.html
Copyright © 2011-2022 走看看