Android SQLite数据库升级

2023-11-19

Android操作SQLite数据库要实现SQLiteOpenHelper类。

 

SQLiteOpenHelper的实现类要重写两个方法onCreate和onUpgrade。

 

onUpgrade方法就是用于SQLite数据库升级

 

 

问题一.数据库升级时直接将老表删除

 

SQLiteOpenHelper 实现类代码

package com.wjn.androiddbdemo.utils.db;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

/**
 * SQLiteOpenHelper实现类
 * */

public class SQLiteHelp extends SQLiteOpenHelper {

    /**
     * 构造方法
     * */

    public SQLiteHelp(Context context, String name, SQLiteDatabase.CursorFactory factory,int version) {
        super(context, name, factory, version);
    }

    /**
     * onCreate方法,第一次创建时调用---->建表
     * */

    @Override
    public void onCreate(SQLiteDatabase db) {
        String sql = "create table user(id int,name varchar(20))";
        db.execSQL(sql);
    }

    /**
     * onUpgrade方法,更新数据库版本时调用---->删除原来的表,重新执行onCreate方法
     * */

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        String sql = "DROP TABLE IF EXISTS user";
        db.execSQL(sql);
        onCreate(db);
        Log.d("TAG","数据库升级!!!");
    }

}

 

即 onUpgrade方法中 

1.先删除表

String sql = "DROP TABLE IF EXISTS user";

db.execSQL(sql);

 

2.再执行onCreate方法重新建表

onCreate(db);

 

 

 

 

 

问题二.数据库升级时要保留老表

 

解决方法

 

1.将旧表改名成临时表: ALTER TABLE User RENAME TO _temp_User;

2.创建新表: CREATE TABLE User (u_id INTEGER PRIMARY KEY,u_name VARCHAR(20),u_age VARCHAR(4));

3.导入数据:INSERT INTO User SELECT u_id,u_name,"18" FROM _temp_User; //原表中没有的要自己设个默认值

4.删除临时表:DROP TABLE_temp_User;

 

 

SQLiteOpenHelper 实现类代码

package com.wjn.androiddbdemo.utils.db;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

/**
 * SQLiteOpenHelper实现类
 * */

public class SQLiteHelp extends SQLiteOpenHelper {

    /**
     * 构造方法
     * */

    public SQLiteHelp(Context context, String name, SQLiteDatabase.CursorFactory factory,int version) {
        super(context, name, factory, version);
    }

    /**
     * onCreate方法,第一次创建时调用---->建表
     * */

    @Override
    public void onCreate(SQLiteDatabase db) {
        String sql = "create table user(id int,name varchar(20))";
        db.execSQL(sql);
    }

    /**
     * onUpgrade方法,更新数据库版本时调用---->删除原来的表,重新执行onCreate方法
     * */

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        //1.将旧表改名成临时表
        String sql1 = "ALTER TABLE user RENAME TO _temp_User";
        //2.创建新表
        String sql2=" CREATE TABLE user (id int,name varchar(20),describe varchar(200));";
        //3.将临时表的数据导入到新表 原表中没有的要自己设个默认值
        String sql3="INSERT INTO User SELECT id,name,\"这是描述\" FROM _temp_User";
        //4.删除临时表
        String sql4="DROP TABLE _temp_User";

        db.execSQL(sql1);
        db.execSQL(sql2);
        db.execSQL(sql3);
        db.execSQL(sql4);
    }

}

 

 

Activity代码

package com.wjn.androiddbdemo.activity.sqlite;

import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.TextView;

import com.wjn.androiddbdemo.R;
import com.wjn.androiddbdemo.utils.db.SQLiteHelp;
import com.wjn.androiddbdemo.utils.ui.StatusBarUtil;

public class SQLiteUpdateActivity extends AppCompatActivity implements View.OnClickListener {

    private TextView textView1;
    private TextView textView;

    private SQLiteHelp dbHelp;//帮助类对象
    private SQLiteDatabase db;//用于管理和操作SQLite数据库

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_sqliteupdate);
        initView();
    }

    /**
     * 初始化各种View
     */

    private void initView() {
        //根据状态栏颜色来决定 状态栏背景 用黑色还是白色 true:是否修改状态栏字体颜色
        StatusBarUtil.setStatusBarMode(this, false, false, R.color.colorPrimary);
        textView1 = findViewById(R.id.activity_sqliteupdate_textview1);
        textView = findViewById(R.id.activity_sqliteupdate_textview);
        textView1.setOnClickListener(this);
        //提高版本升级数据库
        dbHelp = new SQLiteHelp(this, "Test.db", null, 2);
    }

    /**
     * 各种点击事件的方法
     */

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.activity_sqliteupdate_textview1://查询升级后的数据库
                findbtnMethod();
                break;
            default:
                break;
        }
    }

    /**
     * 查询升级后的数据库
     */

    public void findbtnMethod() {
        db = dbHelp.getReadableDatabase();//打开数据库对象
        Cursor cursor = db.query("user", null, null, null, null, null, null);
        //遍历游标对象
        cursor.moveToFirst();
        StringBuilder sb = new StringBuilder();
        while (!cursor.isAfterLast()) {
            int id = cursor.getInt(cursor.getColumnIndex("id"));
            sb.append("ID:" + id + "\n");
            String name = cursor.getString(cursor.getColumnIndex("name"));
            sb.append("姓名:" + name + "\n");
            String describe = cursor.getString(cursor.getColumnIndex("describe"));
            sb.append("描述:" + describe + "\n\n");
            cursor.moveToNext();
        }
        textView.setText(sb.toString());
        cursor.close();
        db.close();
    }

}

 

 

结果

升级前

 

升级后

 

 

 

 

 

问题三.数据库升级时要保留老表(V1 V2 V3 版本)

假如我们已经升级到第三个版本了,我们在第二个版本增加了一个表, 然后第三个版本也增加了一个表,假如用户直接从第一个版本升级到第三个版本,这样 没经过第二个版本,就没有增加的那个表。解决方法

 

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
      
 
      switch(oldVersion){
           case 1:
               db.execSQL(第一个版本的建表语句);
           case 2:
               db.execSQL(第二个版本的建表语句);
           case 3:
               db.execSQL(第三个版本的建表语句); 
     }
 
   
 
}

 

 

 

 

代码链接:https://github.com/wujianning/AndroidDBDemo

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android SQLite数据库升级 的相关文章

随机推荐

  • MySQL之数据库引擎详解(内附面试题:InnoDB和MyISAM的联系与区别)

    Welcome Huihui s Code World 接下来看看由辉辉所写的关于MySQL数据库引擎的相关操作吧 目录 Welcome Huihui s Code World 一 数据库引擎是什么 1 数据库引擎概念 2 最常见的引擎 I
  • Hive:Unable to open a test connection to the given database. JDBC url = jdbc:mysql://master12:3306

    hive启动不成功 一直报各种错 我是执行这条命令出的错 hive service metastore 这个问题困扰了我两三天一直没解决 网上找了各种方法基本都试过 还是不行 可能每个人的原因也不太一样吧 我说我的解决方法 可以试下 1 检
  • 曼哈顿算法公式_Manhattan Distance Calculation(曼哈顿距离算法)

    首先介绍一下曼哈顿 曼哈顿是一个极为繁华的街区 高楼林立 街道纵横 从A地点到达B地点没有直线路径 必须绕道 而且至少要经C地点 走AC和CB才能到达 由于街道很规则 ACB就像一个直角3角形 AB是斜边 AC和CB是直角边 根据毕达格拉斯
  • 【springboot+mybatisplus】分页查询-单表/联表

    参考链接 https www jianshu com p 0a21569f1e06 单表的分页查询用mybatisplus的selectPage就可以实现 联表的分页查询需要自己写sql语句 因为老哥不让写sql语句在DAO层 难看 所以写
  • 图书信息添加

    实现图书信息添加的添加功能并创建字符编码过滤器 避免中文乱码现象的产生 1 创建字符编码过滤器对象 创建字符编码过滤器对象 其名称为CharactorFilter类 该类实现了javax servlet Filter接口 并在doFilte
  • AD采样出来的数值与实际值之间的关系

    当刚接触AD采样时 一直对于AD采集出来的数值与实际的值之间的关系有些模糊 现在闲暇下来打算记录一下 这里以采集量为电压量来记录 当采集温度 电流等模拟量时 都是通过一个电路把模拟量转化为一个电压量输入进AD采样引脚 就不一一叙述 AD采样
  • 结构体对齐(内存对齐)

    本文转自 http www ksarea com articles 20071004 sizeof struct memory html 有的时候 在脑海中停顿了很久的 显而易见 的东西 其实根本上就是错误的 就拿下面的问题来看 struc
  • 【面试刷题】——C++公有继承保护继承和私有继承

    在C 中 有三种继承方式 公有继承 public inheritance 保护继承 protected inheritance 和私有继承 private inheritance 这些继承方式决定了派生类如何继承基类的成员和访问权限 公有继
  • 一文揭秘饿了么跨端技术的演进、实践与落地

    本文会先带领大家一起简单回顾下跨端技术背景与演进历程与在这一波儿接着一波儿的跨端浪潮中的饿了么跨端现状 以及在这个背景下 相较于业界基于 React Vue 研发习惯出发的各种跨端方案 饿了么为什么会选择走另外一条路 这个过程中我们的一些思
  • python稳健回归_statsmodel线性回归(ols)的稳健性问题-Python

    我用统计模型测试了一些基本的类别回归 我建立了一个确定性模型Y X Z 其中X可以取3个值 a b或c Z只能取2 d或e 在那个阶段 模型是完全确定的 我为每个变量设置了如下的权重a s weight 1 b s weight 2 c s
  • Vue基础1:生命周期汇总(vue2)

    Description 生命周期图 可以理解vue生命周期就是指vue实例从创建到销毁的过程 在vue中分为9个阶段 创建前 后 载入前 后 更新前 后 销毁前 后 其他 常用的有 created mounted destroyed 一 创
  • Java中String 和 int 的相互转换

    int gt String int i 12345 String s 第一种方法 s i 第二种方法 s String valueOf i 这两种方法有什么区别呢 作用是不是一样的呢 是不是在任何下都能互换呢 String gt int s
  • 假期实习-踩坑日记

    vue3 x 7 16 elementplus 导入 不同于2 0的导入方式 3 x中main js应当改成如下 import createApp from vue import installElementPlus from plugin
  • 黑盒测试用例设计--题目2

    1 根据下面给出的规格说明 进行测试用例的设计 一个程序读入3个整数 把这三个数值看作一个三角形的3条边的长度值 这个程序要打印出信息 说明这个三角形是普通的 是等腰的 还是等边的 测试用例 2 保险费率计算 某保险公司承担人寿保险 该公司
  • vue中阻止冒泡 阻止默认行为

    1 事件冒泡 不再派发事件 方法 event stopPropagation html
  • 分享一款谷歌插件adguard

    下载地址 链接 https pan baidu com s 1jMAA6kNMr1yqjQKXb7aMtQ 提取码 0kk3
  • PowerShell基础教程(5)——如何自定义 Windows PowerShell

    PowerShell基础教程 5 如何自定义 Windows PowerShell
  • RK3568 IDB烧录失败解决方法

    1 简介 公司有个RK3568的项目使用了三星的8GB eMMC5 1 KLM8G1GETF B041 但在硬件回板的时候 发现个别单板程序烧不进去 会报下载IDB失败 部分串口打印日志如下 DDR Version V1 09 202106
  • 【Grafana】CentOS下安装Grafana

    Grafana CentOS下安装Grafana 本文主要是在CentOS下对Grafana的安装和配置等进行介绍 以及一些踩过的坑 文章目录 Grafana CentOS下安装Grafana 一 基本介绍 二 安装方法 1 从YUM存储库
  • Android SQLite数据库升级

    Android操作SQLite数据库要实现SQLiteOpenHelper类 SQLiteOpenHelper的实现类要重写两个方法onCreate和onUpgrade onUpgrade方法就是用于SQLite数据库升级 问题一 数据库升