sqlite升级

2023-11-20

最近开发中遇到了需要改变项目数据库的表中字段,添加新表等需求,而又需要保证原有数据不变,这就涉及到数据库升级!现在就来总结记录一下:包含原表中增加字段,删除字段,修改字段,添加新表等四种升级操作!

SQLiteOpenHelper类中有两个方法:onCreate 和 onUpgrade,只有在第一次使用应用的时候会执行一次onCreate,之后除非把应用卸载重新安装才会重新执行onCreate,但是卸载的同时原有数据已被清除!因此,想要在改变数据库的同时保证原有数据不变,需要在onUpgrade中做逻辑处理。

具体实例:

public class Person {

    public String name;
    public int age;

    @Override
    public String toString() {
        return "name: "+name+" ,age: "+age;
    }
}

首次应用,创建数据库,并创建一张表,这时数据库版本是1

public DBHelper(Context context) {
        super(context, "person.db", null, 1);
}

    @Override
public void onCreate(SQLiteDatabase db) {
        db.execSQL("create table user (_id integer primary key autoincrement,age Integer(20),name varchar(20))");
}

一、添加city字段
Person中添加city属性,类型String

public DBHelper(Context context) {
        super(context, "person.db", null, 2);
}

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        switch (newVersion){
            case 2://升级添加多个字段时只能一个一个添加
                String sql = "ALTER TABLE user ADD COLUMN city VARCHAR";
                db.execSQL(sql);
                break;
}

二、删除表中某个字段
删除Person中的city字段

public DBHelper(Context context) {
        super(context, "person.db", null, 3);
    }

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
       switch (newVersion){
            case 3:
           /**删除表中某个字段*/
           //1.将表名改为临时表
             String sqlDrop1 = "ALTER TABLE \"user\" RENAME TO \"_User_temp_2016\";";
             db.execSQL(sqlDrop1);
          //2.创建新表(新表中没有city这个字段)
             String sqlDrop2 = "CREATE TABLE \"user\" (_id integer primary key autoincrement,sex varchar(20),name varchar(20))";
             db.execSQL(sqlDrop2);
          //3.将临时表中数据导入新表
             String sqlDrop3 = "INSERT INTO \"user\" (\"_id\",\"sex\", \"name\") SELECT \"_id\", \"age\" ,\"name\" FROM \"_User_temp_2016\";";
             db.execSQL(sqlDrop3);
          //4.更新sqlite_sequence
             String sqlDrop4 = "UPDATE \"sqlite_sequence\" SET seq = 3 WHERE name = 'user';";
             db.execSQL(sqlDrop4);
         //5.删除临时表
         String sqlDrop5 = "DROP  TABLE _User_temp_2016;";
         db.execSQL(sqlDrop5);

            //直接用下面的方法来删除字段是无效的
//   String sqlDrop = "ALTER TABLE user DROP COLUMN city";
//   db.execSQL(sqlDrop);
                break;
    }
}

三、修改字段

将Person中age字段修改为String类型的sex

public DBHelper(Context context) {
        super(context, "person.db", null, 4);
    }

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
       switch (newVersion){
            case 4:
            /**修改表中原有字段*/
            //1.将表名改为临时表
                String sql1 = "ALTER TABLE \"user\" RENAME TO \"_User_old_20160909\";";
                db.execSQL(sql1);
           //2.创建新表
                String sql2 = "CREATE TABLE \"user\" (_id integer primary key autoincrement,sex varchar(20),name varchar(20),city varchar(20))";
                db.execSQL(sql2);
           //3.将临时表中数据导入新表
              String sql3 = "INSERT INTO \"user\" (\"_id\",\"sex\", \"name\",\"city\") SELECT \"_id\", \"age\" ,\"name\",\"city\" FROM \"_User_old_20160909\";";
                db.execSQL(sql3);
          //4.更新sqlite_sequence
            String sql4 = "UPDATE \"sqlite_sequence\" SET seq = 3 WHERE name = 'user';";
                db.execSQL(sql4);
                /**
                 * 由于在Sqlite中使用自增长字段,引擎会自动产生一个sqlite_sequence表,用于记录每个表的自增长字段的已使用的最大值,所以要一起更新下。如果有没有设置自增长,则跳过此步骤。
                 * */

           //5.删除临时表(这一步可以做,也可以不做)
      String sql5 = "DROP  TABLE _User_old_20160909;";
      db.execSQL(sql5);
          break;
    }
}

四、添加新表

public DBHelper(Context context) {
        super(context, "person.db", null, 5);
    }

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
       switch (newVersion){
       case 5:
     //添加一张表
    db.execSQL("create table person (_id integer primary key autoincrement,age Integer(20),name varchar(20),city varchar(20))");

                break;
       }
}

好了,暂时就到这里了!未完待续…..

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

sqlite升级 的相关文章

随机推荐

  • 攻防世界—file_include

    打开之后发现是一段php代码 可以看出这是段代码有文件包含漏洞 下面是学习部分 着急看题解继续往下滑 谢谢 文件包含漏洞 File Inclusion Vulnerability 是一种Web应用程序常见的安全漏洞 也是攻击者常用的攻击手段
  • 自激振荡现象

    理论上说 自激振荡是指当放大器加电后 还没有加载输入信号 输出端就出现了高频的类似于正弦波一样的波形 实际中 还有另外一种情况 也属于自激振荡 当输入某些信号时 输出是正常的 一旦改变输入信号幅度或者频率到某些特定值 输出波形在原基础上会叠
  • redis概述、不同系统安装以及redis配置文件redis.conf各参数详细介绍

    目录 redis简介 简介 特点 优势 redis与其他key value数据库的区别 redis的安装 windows linux ubuntu下安装 redis配置 redis数据类型 String 字符串 Hash 哈希 List 列
  • 【总结】LinkedBlockingQueue为什么可以实现双锁算法

    LinkedBlockingQueue 双锁算法 putLock takeLock 为什么可以实现 put操作是将新节点放在队尾 take操作是将队首的节点取出 故两操作是满足FIFO 这在队列不为空时 避免了put和take会操作同一个元
  • JavaScript 节流和防抖

    前言 本文主要记录了JavaScript 节流和防抖 节流和防抖本质上是优化执行高频率代码的一种手段 例如 浏览器的 mousemove resize scroll 等事件在触发时 会不断地调用绑定的事件函数极大地降低了前端的性能 为了性能
  • C#、js如何实现文件上传功能

    上传文件 今天我来讲讲在MVC中如何进行文件的上传 我们逐步深入 一起来看看 我们在默认创建的项目中的控制器下添加如下 第一步创建一个接受文件的实体 创建好后判断一下接受文件的是什么文件类型如txt 然后就是文件名称建好后检查目录文件是否存
  • CVPR2017-如何在无标签数据集上训练模型

    论文 Fine tuning Convolutional Neural Networks for Biomedical Image Analysis Actively and Incrementally 论文链接 http openacce
  • 深入解析Spring Boot中最常用注解的使用方式(下篇)

    摘要 本文是 深入解析Spring Boot中最常用注解的使用方式 的下篇内容 将继续介绍Spring Boot中其他常用的注解的使用方式 并通过代码示例进行说明 帮助读者更好地理解和运用Spring Boot框架 目录 第二部分 常见的容
  • 全国职业技能大赛云计算--高职组赛题卷④(容器云)

    全国职业技能大赛云计算 高职组赛题卷 容器云 第二场次题目 容器云平台部署与运维 任务1 Docker CE及私有仓库安装任务 5分 任务2 基于容器的web应用系统部署任务 15分 任务3 基于容器的持续集成部署任务 15分 任务4 Ku
  • 哈希表的设计

    概念 顺序结构以及平衡树 中 元素关键码与其存储位置之间没有对应的关系 因此在 查找一个元素时 必须要经过关键 码的多次比较 顺序查找时间复杂度为 O N 平衡树中为树的高度 即 O 搜索的效率取决于搜索过程中 元素的比较次数 理想的搜索方
  • 主页自定义可拖动组件 2.0版本 (portlet)

    首先 我是从下面这个页面抠出来的 http wrapbootstrap com preview WB00958H8 效果 在这个页面直接右键查看源代码 就可以看到了 非常清楚 因为我就只用这么一个portlet功能 我就给抠下来了 原来的代
  • webservice ajax课程,net webservice ajax访问

    function getdata click function ajax type Post url http localhost 65497 WebSite1 WebService asmx GetAge id 3344 data id
  • onload和ready的区别

    三个方面 window onload document ready 执行时机 必须等待网页全部加载完毕 包括图片等 然后再执行包裹代码 只需要等待网页中DOM结构加载完毕 就能执行包裹的代码 执行次数 只能执行一次 如果第二次 那么第一次的
  • 性能优化——设计更优的分布式锁?

    那什么是分布式锁呢 它又是用来解决哪些问题的呢 在 JVM 中 在多线程并发的情况下 我们可以使用同步锁或 Lock 锁 保证在同一时间内 只能有一个线程修改共享变量或执行代码块 但现在我们的服务基本都是基于分布式集群来实现部署的 对于一些
  • 主力吸筹猛攻指标源码_通达信指标——一目了然,简单易懂的变色成交量副图指标...

    大家好 这期给大家分享的变色成交量副图指标看量柱颜色变化 一目了然 换手率 VOL CAPITAL 100 主力吸筹 换手率 gt 3 AND 换手率 lt 5 COLORFF00FF 加快吸筹 换手率 gt 5 AND 换手率 lt 7
  • 智能指针之与shared_ptr有关的enable_shared_from_this类模板04

    一 enable shared from this模板类详解 什么时候该使用enable shared from this模板类 当我们需要一个类对象返回本身并且该类使用了shared ptr智能指针时 就需要使用enable shared
  • Ubuntu20中,rosdep init失败,无法rosdep update问题的解决。百分百有效。

    一 进入到 sources list d 文件夹 修改 gedit 20 default list cd etc ros rosdep sources list d sudo gedit 20 default list 将里面所有的 raw
  • gdb attach 进程调试

    gdb调试正在运行的进程 GDB可以对正在执行的程序进行调度 它允许开发人员中断程序 并查看其状态 之后还能让这个程序正常地继续执行 gdb attach xxxxx xxxxx为利用ps命令获得的子进程process
  • interview

    收割机博客 https blog csdn net DERRANTCM article details 73456550 查找算法 https blog csdn net derrantcm article details 51534498
  • sqlite升级

    最近开发中遇到了需要改变项目数据库的表中字段 添加新表等需求 而又需要保证原有数据不变 这就涉及到数据库升级 现在就来总结记录一下 包含原表中增加字段 删除字段 修改字段 添加新表等四种升级操作 SQLiteOpenHelper类中有两个方