Android数据库升级解决方案

2023-11-05

方案一 第三方库ActiveAndroid数据库

在对应继承model的实体类中添加的字段,并且对应的数据库版本升级+1.在assert资源文件添加一个migrations文件夹,里面创建文件“版本号.sql”,文件中添加数据库脚本,即"ALTER TABLE 表名 COLUMN Priority TEXT"

方案二 通过SQLiteOpenHelper的特性

特性

SQLiteOpenHelper有两个回调方法,分别为onCreate()、onUpgrade()。onCreate()软件第一次安装创建数据库会回调,如果后面其他版本升级不回调该方法,会回调onUpdate()方法。

举例

软件有三个版本了,即V3.0。如下有3种安装情况:
1.v 1.0------> v3.0 不回调onCreate,回调onUpgrade
2.v 2.0------> v3.0 不回调onCreate,回调onUpgrade
3.v 30直接安装 回调onCreate,不会回调onUpgrade
为了兼容各种情况安装app,保证数据库表的字段都能完美添加进去:
1.v 1.0------> DATABASE_VERSION=1001 onCreate 创建数据表
2.v 2.0------> DATABASE_VERSION=1002 onCreate ---- 创建数据表(v1.0代码不变),并调取onUpgrade(DATABASE_VERSION>1001)
onUpgrade()方法里面添加name
3.v3.0 ------> DATABASE_VERSION=1003 onCreate ---- 创建数据表 (v1.0代码不变)
onUpgrade(DATABASE_VERSION>1001)
onUpgrade --添加-- name(v2.0代码不变)
onUpgrade --添加-- address year

思路

数据库升级解决方案思路如下:软件第一次安装创建在oncreate()方法里面创建数据库和表,并调取重写对应的onUpgrade()方法,在对应的onUpgrade()方法中不同版本去创建对应的字段,从而保证数据库完美升级。

代码实现

其中SQL.java是建表语句

public class SQL {
    public static final String T_USER = "user";
 
 
    public static final String CREATE_TABLE_USER =
            "CREATE TABLE IF NOT EXISTS " + T_USER + "(" +
                    "id VARCHAR PRIMARY KEY, " +
                    "school VARCHAR, " +
                    "sex VARCHAR, " +
                    "createDate VARCHAR " +
                    ")";
}
public class DBHelper extends SQLiteOpenHelper {
 
    private static final String DATABASE_NAME = "simple.db"; 
    private static final int DATABASE_VERSION = 1003;
 
    private static DBHelper instance = null;
 
 
    public DBHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }
     
    public synchronized static DBHelper getInstance(Context context) {
        if (instance == null) {
            instance = new DBHelper(context);
        }
        return instance;
    }
 
    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(SQL.CREATE_TABLE_USER);
         
        // 若不是第一个版本安装,直接执行数据库升级
        // 请不要修改FIRST_DATABASE_VERSION的值,其为第一个数据库版本大小
        final int FIRST_DATABASE_VERSION = 1001;
        onUpgrade(db, FIRST_DATABASE_VERSION, DATABASE_VERSION);
    }
 
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // 使用for实现跨版本升级数据库
        for (int i = oldVersion; i < newVersion; i++) {
            switch (i) {
            case 2:
                upgradeToVersion01(db);
                break;
            case 3:
                upgradeToVersion02(db);
                break;
            default:
                break;
            }
        }
    }
     
    private void upgradeToVersion01(SQLiteDatabase db){
        // user表新增1个字段
        String sql1 = "ALTER TABLE "+SQL.T_FAVORITE+" ADD COLUMN name VARCHAR";
        db.execSQL(sql1);
    }																			
    private void upgradeToVersion02(SQLiteDatabase db){
        // user表新增2个字段,添加新字段只能一个字段一个字段加,sqlite有限制不予许一条语句加多个字段
        String sql1 = "ALTER TABLE "+SQL.T_USER+" ADD COLUMN address VARCHAR";
        String sql2 = "ALTER TABLE "+SQL.T_USER+" ADD COLUMN age VARCHAR";
        db.execSQL(sql1);
        db.execSQL(sql2);
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android数据库升级解决方案 的相关文章

  • 确定是否在已取得 root 权限的设备上运行

    我的应用程序具有某些功能 该功能只能在具有 root 权限的设备上运行 与其让此功能在使用时失败 然后向用户显示适当的错误消息 我更喜欢能够先默默地检查 root 是否可用 如果不可用 则首先隐藏相应的选项 有没有办法做到这一点 这是一个类
  • 如何在android中点击画布上绘制的圆圈?

    我正在开发一个人脸检测应用程序 在这个应用程序中 我必须在脸上的眼睛和嘴巴用户可以点击拖动圆圈 在检测到的人脸上根据自己设置位置 因此 所有圆圈都已成功绘制在脸上 但我无法单击特定圆圈并使用缩小选项在整个脸上移动 请建议我有关相同问题的正确
  • Whatsapp 在 Android 中共享音频文件时正在剪切音频文件

    我在共享格式不是 mp3 的音频文件时遇到问题 文件被共享 但长度较短 例如 如果文件有 10 秒 则仅共享 5 秒 如果我使用 mp3 格式 它会完全共享 但其他格式会出现问题 注意 该文件在其他应用程序 如Messenger 中共享没有
  • fresco 的 Proguard 错误

    我正在使用 ProGuard 当我在发布配置中运行项目时 出现以下错误 Warning com facebook imagepipeline bitmaps DalvikBitmapFactory can t find referenced
  • Android 构建 gradle 在特定设备上失败

    我面临一个奇怪的问题 当我编译我的应用程序以在 Android 7 0 的设备上运行它时 它可以工作 但是当我尝试为 Android 4 2 1 的设备进行编译时 它会失败并出现以下错误 错误 任务 app transformClasses
  • 在屏幕上随机生成一个圆圈并将其设为绿色或红色

    所以我一直在尝试制作一个游戏应用程序 它可以在 Android 屏幕上随机显示带有文本的红色按钮或带有文本的绿色按钮 如果有人可以帮助我 我将不胜感激 另外 如果有人知道如何做到这一点 我想慢慢地产生更快的酷优势 谢谢 SuppressLi
  • 为网络和/或持久存储序列化 Android Bundle?

    我需要序列化一个全面的应用程序 游戏 状态 以便通过网络传输或保存到磁盘并在以后检索 当然 捆绑包用于在多个用例中保存 恢复状态 因此使用它们将是理想的选择 但是 由于某种原因 Bundle 不可序列化 寻找解决方案只发现了将 Bundle
  • 如何在 android-studio 0.3.6 中运行 Gradle 1.9?

    我只是花了一些时间尝试将现有的 android studio 项目从 gradle 1 8 迁移到 gradle 1 9 Final 昨天发布 但失败了19th Nov 我在这里阅读了大多数其他与 gradle 相关的帖子 但没有一个对我有
  • 如何在代码中设置TextView的文字颜色?

    在 XML 中 我们可以通过以下方式设置文本颜色textColor属性 比如android textColor FF0000 但如何通过编码来改变它呢 我尝试过类似的东西 holder text setTextColor R color R
  • 如何从debug.keystore文件获取MD5?

    我使用一些命令来获取 MD5 私钥debug keystore文件 但实际上我得到的是 SHA1 私钥而不是 MD5 我不知道如何获得MD5 这是我使用的命令 keytool list alias androiddebugkey keyst
  • Android 依赖项:apklib 与 aar 文件

    据我了解 apklib包含代码 共享资源Maven aar文件由以下人员分发Gradle The aar与 apklib 的主要区别在于 类被编译并包含在 aar 根目录下的classes jar 中 然而apklib不能包含已编译的类文件
  • 对基本适配器类及其功能的疑问

    我正在尝试自定义列表视图 我使用数组列表添加对象列表 并将其发送到扩展基本适配器的类 当我扩展基本适配器类时 它实现了一些方法 例如 getView 等 在 getView 中 我将其发送到将名称 数据 分配给 XML 格式的自定义菜单的类
  • 如何在Android中隐藏应用程序标题? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我想隐藏应用程序标题栏 您可以通过编程来完成 import android app Activity import android os
  • 在Android的activity中调用onResume

    在活动的过程中通过调用 this OnResume 强制 onResume 事件可以吗 或者我应该实现另一个由 OnResume 和第一个成员调用的过程 实现在您的重写中调用的另一个过程onResume 后者不打算由您调用 它是一种方便的方
  • Android 将菜单项在操作栏中向左对齐

    我的应用程序中有一个操作栏 它显示我定义的菜单项res menu activity main xml 我的菜单项在操作栏上向右对齐 我希望它们左对齐 我为此找到的唯一解决方案使用了自定义操作栏 如下所示 将菜单项放置在 Honeycomb
  • onTouch 给出奇怪的触摸点 Android

    我正在做的事情非常简单 我以前做过 但现在它没有按我的预期运行 无论如何 让我简要解释一下我正在尝试做什么以及我得到了什么 设想 我有一个RelativeLayout其中一个ImageView已放置 现在我设置touchlistener像这
  • 协程和 Firebase:如何实现类似 Javascript 的 Promise.all()

    在 Javascript 中 您可以同时启动两个 或更多 异步任务 等待它们完成 然后执行某些操作 继续 const firstReturn secondReturn await Promise all firstPromise secon
  • 使用 eclipse 配置mockito 时出现问题。给出错误:java.lang.verifyError

    当我将我的mockito库添加到类路径中 并使用一个简单的mockito示例进行测试时 我尝试使用模拟对象为函数add返回错误的值 我得到java lang verifyerror 以下是用于测试的代码 后面是 logcat Test pu
  • 从 AlertDialog 返回值

    我想构建一个函数来创建 AlertDialog 并返回用户输入的字符串 这是我用于创建对话框的函数 如何返回该值 String m Text private String openDialog String title AlertDialo
  • Admob - 没有广告可显示

    你好 我尝试制作一些在 Android 手机上显示广告的示例程序 并尝试在 v2 2 的模拟器上测试它 代码中的一切似乎都很好 但调试器中的 AdListener 表示 响应消息为零或空 onFailedToReceiveAd 没有广告可显

随机推荐

  • 微信小程序web-view使用说明,及链接打不开问题

    开发微信小程序时 有时会需要在小程序内打开网页链接 这时就需要用到 web view 标签 web view 是小程序上用来承载网页的容器 且每个页面只能有一个 web view 它会自动铺满整个页面 并覆盖其他组件 目前个人类型的小程序上
  • Requests入门

    前言 爬虫三大库 Requests Lxml BeautifulSoup Requests库的官方文档指出 让HTTP服务于人类 Requests库的作用就是请求网站获取网页数据的 今天我们来了解一下Requests库 如果感觉博主的文章还
  • 最新最全GPT-3模型网络结构详细解析

    最近 GPT3很火 现在有很多讲GPT 3的文章 比如讲解它可以做什么 思考它的带来的影响 可视化其工作方式 看了这些文章并不足以详细了解GPT 3模型 仍然需要认真研究相关论文和博客 因此 本文主要目标 帮助其他人对GPT 3体系结构有一
  • 放炮罚计算器软件

    放炮罚计算器软件 放炮罚 又称为百胡 红胡 告胡子 跑胡子 煨胡子 是湖南人喜欢的一种字牌娱乐活动 据说起源于双峰 又称为双峰跑胡子 放炮罚由于其灵活多变 惊险刺激 而广受湖南人民的喜爱 街头巷尾随处可见在玩放炮罚的广大兄弟姐妹 这种字牌游
  • Linux进程之调度器

    1 Linux调度器的原理 Linux调度器 Linux Scheduler 负责管理这一进程在CPU上运行时的资源分配 它根据选定策略和所估算的进程行为 考量各种因素的权重 对等待在运行队列的进程按优先级排列 从而决定哪个进程能够接下来获
  • base64加密解密

    String random UUID randomUUID toString replaceAll substring 0 8 随机八位数字字母结合字符串 System out println random 2458ec59 String
  • 期货开户收费政策非常合理

    需要大家支付的费用由两部分组成 一部分是保证金 另一部分是费率 保证金和费率都由交易所收取 收取的费用是固定的 因为后期大家投资的项目是不一样的 所以需要大家准备的费用肯定也不一样 除了交易所所收取的费用以外 还包括了开户公司所收取的费用
  • 51单片机原理图

    51单片机 TOC
  • ANDROID APP的页面布局(Part I)

    做一个好的APP自然是不能缺少一个好的漂亮的且合理的页面布局了 ANDORID里面支持的布局大致上有下列即种 根据界面的需要使用不同的布局可达到事半功倍的效果 这个跟做HMTL的页面的原理是一样 好的页面看起来就是舒服 而且容易维护 1 L
  • Lambda表达式与函数式编程

    文章目录 函数式编程 Stream流 概述 为什么学 函数式编程思想 Lambda表达式 概述 Lambda表达式的前身 省略规则 Stream流 概述 案例数据准备 创建流 中间操作 终结操作 reduce归并 注意事项 Optional
  • C语言运算符优先级(超详细)

    转自 http blog csdn net huangblog article details 8271791 每当想找哪个运算符优先级高时 很多时候总是想找的就没有 真让人气愤 现在 终于有个我个人觉得非常全的 分享给大家 欢迎拍砖 C语
  • 前端开发面试题及答案整理(合集)

    前端开发面试题及答案 1 对Web标准以及W3C的理解与认识 答 标签闭合 标签小写 不乱嵌套 提高搜索机器人搜索几率 使用外链CSS和JS脚本 结构行为表现的分离 文件下载与页面速度更快 内容能被更多的用户所访问 内容能被更广泛的设备所访
  • Qt 助手 assistant 单独运行 及 字体设置

    曾经在 Qt creator上 不知道点击了哪里 Qt 助手也是可以单独运行的 这样就可以不需要安装字体了 但是 一直没有找到这个重现的规则 或者快捷键 1 运行Qt 助手 assistant linux 所在目录 xxxxxx Qt5 1
  • java调用 Myeclipse用jax-ws创建的webservice具体方法(三)

    首先需要下载所需的jar包 webservices所需全部jar包下载 点击打开链接 直接上代码 import java net MalformedURLException import java net URL import java r
  • 基于亚奈奎斯特采样和SOMP算法的平板脉冲响应空间插值matlab仿真

    目录 1 算法运行效果图预览 2 算法运行软件版本 3 部分核心程序 4 算法理论概述 5 算法完整程序工程 1 算法运行效果图预览 2 算法运行软件版本 matlab2022a 3 部分核心程序 fine regular grid NSa
  • Could not resolve placeholder 'jdbc.driverClassName' in string value "${jdbc.driverClassName}

    org springframework beans factory BeanDefinitionStoreException Invalid bean definition with name dataSource defined in f
  • $.ajaxFileUpload上传文件出现错误...问题总结

    1 加载报错 ajaxfileupload js 1 Uncaught ReferenceError jQuery is not defined 上传报错 Uncaught TypeError ajaxFileUpload is not a
  • C++ Pat甲级1003 Emergency (25 分)图+dfs

    1003 Emergency 25 分 As an emergency rescue team leader of a city you are given a special map of your country The map sho
  • FPGA实现电机转速PID控制

    通过纯RTL实现电机转速PID控制 包括电机编码器值读取 电机速度 正反转控制 PID算法 卡尔曼滤波 最终实现对电机速度进行控制 使其能够渐近设定的编码器目标值 一 设计思路 前面通过SOPC之NIOS 实现电机转速PID控制 调用中断函
  • Android数据库升级解决方案

    方案一 第三方库ActiveAndroid数据库 在对应继承model的实体类中添加的字段 并且对应的数据库版本升级 1 在assert资源文件添加一个migrations文件夹 里面创建文件 版本号 sql 文件中添加数据库脚本 即 AL