无法在 Samsung 上将数据库从版本“n”降级到“n-1”

2024-03-25

我有一个带有数据库的应用程序,使用标准 SQLiteOpenHelper 创建和打开。

每当我升级数据库版本时,我也会升级应用程序的版本代码,因此数据库没有办法下降(数据库版本号总是增加,从不减少)。

我通过设置禁用了应用程序中的数据库备份android:allowBackup属性为 false。

但是当我在 Play 商店升级应用程序时,我遇到了很多崩溃

无法从版本降级数据库n to n-1

其中 96% 的崩溃发生在运行 .任何人都知道为什么会出现这个问题,更重要的是如何防止这种崩溃?

我知道我可以重写 onDowngrade 以防止崩溃,但实际上我不明白为什么调用 onDowngrade ,因为崩溃是在始终使用数据库最新版本的应用程序上调用的。

Edit:添加了代码示例,FWIW

我的开放助手:

public class MyDBHelper extends SQLiteOpenHelper {

    private static final String LOG_TAG = MyDBHelper.class.getName();

    public static final String DB_NAME = "my_db";
    public static final int DB_V1 = 1;
    public static final int DB_V2_UNIQUE_IDS = 2;
    public static final int DB_V3_METADATAS = 3;
    public static final int DB_V4_CORRUPTED_IDS = 4;
    public static final int DB_V5_USAGE_TABLE = 5;

    public static final int DB_VERSION = DB_V5_USAGE_TABLE;

    public MyDBHelper(final Context context, IExceptionLogger logger) {
        super(context, DB_NAME, null, DB_VERSION);
    }

    @Override
    public void onCreate(final SQLiteDatabase db) {
        Debug.log_d(DebugConfig.DEFAULT, LOG_TAG, "onCreate()");
        db.execSQL(createMyTable());
    }

    @Override
    public void onUpgrade(final SQLiteDatabase db, final int oldVersion, final int newVersion) {
        Debug.log_d(DebugConfig.DEFAULT, LOG_TAG, "onUpgrade(): oldVersion = " + oldVersion + " : newVersion = " + newVersion);

        if (oldVersion < 2) {
            Debug.log_d(DebugConfig.DEFAULT, LOG_TAG, "onUpgrade(): upgrading version 1 table to version 2");
            db.execSQL(upgradeTable_v1_to_v2());
        }

        if (oldVersion < 3) {
            Debug.log_d(DebugConfig.DEFAULT, LOG_TAG, "onUpgrade(): upgrading version 2 Entry table to version 3");
            db.execSQL(upgradeTable_v2_to_v3());
        }
    }

    @Override
    @TargetApi(Build.VERSION_CODES.FROYO)
    public void onDowngrade(final SQLiteDatabase db, final int oldVersion, final int newVersion) {
        Debug.log_d(DebugConfig.DEFAULT, LOG_TAG, "onDowngrade(): oldVersion = " + oldVersion + " : newVersion = " + newVersion);
        super.onDowngrade(db, oldVersion, newVersion);
    }
}

以及我如何初始化它:

public class DatabaseController {

    private MyDBHelper mDBHelper;

    public void initialize(final Context context) {

       mDBHelper = new MyDBHelper(context);

    }
}

这是默认实现SQLiteOpenHelper.onDowngrade(...):

public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    throw new SQLiteException("Can't downgrade database from version " +
            oldVersion + " to " + newVersion);
}

正如你所看到的,如果你打电话super.onDowngrade(...),正如您所做的那样,您将得到该异常。你需要实施onDowngrade自己,无需打电话super.onDowngrade。为了完整性,应该始终实现它,因为无法保证何时会调用它 - 用户已更改为使用旧版本的应用程序听起来很奇怪,但可能会出现类似的情况。您知道异常来自哪个版本的应用程序吗?

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

无法在 Samsung 上将数据库从版本“n”降级到“n-1” 的相关文章

  • dagger.hilt.android.internal.managers.ViewComponentManager$FragmentContextWrapper 无法转换为 android.app.Activity

    我正在使用具有一些自定义视图实现的第三方库 在实现中 他们调用Utils showSoftKeyboard context as Activity 这与使用片段作为 AndroidEntryPoint 一起导致以下异常 java lang
  • 我们如何从 Android 通知中提取 bigpicturestyle 图像?

    我有一个通知侦听器服务 可以读取来自其他应用程序的通知 经用户许可 并提取所有数据 能够访问除通知展开视图中显示的图像之外的所有内容 我也在阅读 EXTRA PICTURE 意图值 if extras containsKey Notific
  • Realm 中的更新语句

    I have VisitingCardPOJO表格 我想更新单个条目说在哪里no 3 VisitingCardPOJO java public class VisitingCardPOJO extends RealmObject Prima
  • 模仿 youtube/gmail 应用程序的导航抽屉

    背景 近几个月来 谷歌发布了Youtube 应用程序 http www androidpolice com 2013 08 19 breaking massive youtube for android v5 0 update brings
  • 在 Android 中从麦克风录制 wav 文件 - 问题

    我需要能够使用 Android 中的麦克风创建 WAV 文件 目前 我遇到了很多麻烦 到目前为止 这就是我的情况 我正在使用 micDroid 项目代码的一部分来记录 read thread int sampleRate 44100 int
  • 使用 NEON 内在函数除以浮点数

    我当时正在处理四个像素的图像 这是在armv7对于 Android 应用程序 我想分一个float32x4 t向量由另一个向量组成 但其中的数字与大约不同0 7 to 3 85 在我看来 除法的唯一方法是使用右移 但这是针对一个数字2 n
  • 视图无法解析为类型

    这里的视图似乎有什么问题 我该如何解决它 错误 视图无法解析为类型 public void onItemClick AdapterView
  • 如何解决:无法解析:com.mapbox.mapboxsdk:mapbox-android-sdk:9.5.0

    我在Android studio中尝试使用mapbox时遇到这个问题无法解析 com mapbox mapboxsdk mapbox android sdk 9 5 0 问题是什么 我的 build gradle 依赖项 dependenc
  • 在android中从JSON生成listview

    我对 Android 完全陌生 目前正在尝试从从我的服务器中提取的 JSON 数组生成列表视图 我已经阅读了很多教程 但没有运气 有一种独特的方法可以做到这一点 请您指出一些适合开始的资源 我读过了this http www josecgo
  • Android Gradle 问题 - Flutter / Dart

    我的 Gradle 同步有问题 我使用 IntelliJ 和 Android Studio 构建 Flutter Dart 应用程序 我添加了 2 个新的依赖项 现在 Gradle 出现了问题 在 Android Studio 中一切正常
  • Android NDK 支持区域设置吗?

    我真正想做的就是使用格式化日期strftime x 以正确的顺序 在大多数平台上调用setlocale 足够 在 Android 上 我不断收到 美国日期 那么 Android 不支持语言环境吗 No setlocale and strft
  • PhoneGap 1.4 封装 Sencha Touch 2.X - 性能怎么样?

    我正在构建一个多平台平板电脑应用程序 仅使用其 Webview 使用 Phonegap 1 4 对其进行包装 然后使用 Sencha Touch 2 框架发挥我的魔力 我所说的多平台是指 iOS 5 X 和 Android 3 0 目前 到
  • Jetpack Compose 中复选框中的透明复选标记

    在我的 Compose 应用程序中 我需要创建一个圆形复选框 我已经通过下面的代码实现了这一点 Composable fun CircleCheckBox isChecked Boolean modifier Modifier Modifi
  • Android Studio代理设置构建错误

    每当我尝试在 Android Studio 中构建应用程序时 都会收到以下错误 Error 169 254 16 169 254 16 Will ignore proxy settings for these hosts 我收到错误 5 次
  • 以编程方式向 LinearLayout 添加边框

    我该如何添加以编程方式LinearLayout 的边框 假设我们创建了这个布局 LinearLayout TitleLayout new LinearLayout getApplicationContext TitleLayout setO
  • Android TextureView 和硬件加速

    我正在尝试实现上所示的示例这一页 http developer android com reference android view TextureView html 我已经在运行 android 4 及以上版本的三种不同设备上进行了尝试
  • React Native HTTPS Api 调用在 IOS 中有效,但在 Android 中无效

    所以基本上我所做的就是简单地对启用了 HTTPS 的 UAT 服务器进行简单的 Axios 调用 我已经在 IOS 中测试了整个应用程序 API 调用工作正常 但一旦我在 Android 中测试了相同的应用程序 在真正的 Android 设
  • Android:分配内存失败

    我正在尝试创建一个具有 2047 mb 内存的模拟器 当我运行它时 我收到此错误 2011 02 22 14 24 14 Emulator 2011 02 22 14 24 14 Emulator This application has
  • android系统用户和linux root用户有什么区别

    当我将手机连接到电脑并使用adb shell与我的手机通信并输入的命令ps命令输出当前在我的手机上运行的进程信息 我发现有两个特殊用户 一个是root 另一个是system 据我所知 Android是基于linux的 所以root用户是最大
  • 在线性布局内的 ScrollView 内并排对齐 TextView

    我有一个带有滚动视图的线性布局 我想保留它的当前格式 但只需将 textView2a 和 textView3a 并排放置 而不会破坏我当前的布局格式 我已经包含了我最近的尝试 但它们似乎不正确 提前致谢 Java菜鸟 当前有效的 XML

随机推荐

  • 安全方法为无安全性,但不允许页面提取和文档组装

    我有一个非常奇怪的问题 我不确定问题出在哪里 我正在创建 PDF 但未设置任何安全限制或密码 当我在 Adob e Reader DC 中打开 PDF 并获取属性时 它确实将安全方法显示为 无安全 但是 文档组装和页面提取设置为不允许 PD
  • 即席查询和存储过程哪个更好? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • btree是如何存储在光盘上的?

    我知道如何在内存中实现b树 但不清楚如何在光盘中存储trie 我认为主要有两点区别 内存指针和磁盘地址之间的转换 看这个 插入新的k v项时如何拆分页面 在内存中很容易实现 Thanks 这完全取决于您使用的 DBMS 如果您想知道它是如何
  • angular-cli 库创建辅助入口点

    我正在尝试创建我认为所谓的 Angular npm 包的辅助入口点 我想要以下两个入口点 scope data service scope data service models 使用 angular cli 生成基础包生成以下结构 sco
  • linq 中的简单选择查询

    假设我有一个学生表 我想显示 ID 为 1 的学生 SELECT FROM STUDENT ST WHERE ST ID 1 这就是我在 Linq 中实现这一目标的方法 StudentQuery from r in oStudentData
  • VBA - 冒号“:”如何在带有条件的 VBA 代码中工作

    冒号运算符 是VBA中的语句分隔符 但是 有谁知道为什么前三个示例有效而第四个示例 未注释时 会产生错误 Option Explicit Public Sub TestMe If 1 1 Then Debug Print 1 If 2 2
  • 如何将 .txt 读入 Python 对象列表?

    我正在尝试使用 Python 制作纸牌游戏 下面有这个文本文件 其中包括卡 ID 卡名称 卡描述和卡生命值 1 Medusa Feel The Wraith 98 2 Gigle See Him See Him 54 3 Brozi Pin
  • 使用 VLC imem 从内存播放 h264 视频文件但收到错误“主流错误:无法预填充缓冲区”

    我有一个加载到内存中的 h264 视频文件 我尝试使用参数 imem cat 4 使用 imem 播放它 以便 vlc 将使用访问模块来解复用视频 并且 vlc 启动并接收我的 imem参数成功 0x7f38a0000e28 access
  • 如何使用Protocol-buffer在Java中反序列化文件?

    想要在 C 中创建序列化文件 然后想在 Java 中反序列化该文件 为此 我正在使用 Protocol buffer 库 我想要做的是 在 C 中 我添加了 protobuf net dll 要序列化的类表示为 人物 cs ProtoBuf
  • 在 Android 中禁用 Spinner

    我在使用时遇到问题android enabled false 它不是禁用 the 成分在这种情况下 它是spinner 不知道它是否相关 但它属于布局的一部分viewflipper 有任何提示或解决方法吗 Thanks 在设置适配器之前禁用
  • 反转 Map 最简洁的 Scala 方法是什么?

    反转 Map 最简洁的 Scala 方法是什么 映射可能包含非唯一值 EDIT 的逆转Map A B 应该给Map B Set A 或者 MultiMap 那就更好了 如果您可能丢失重复的密钥 scala gt val map Map 1
  • 如何使用代理设置部署 Angular 应用程序

    我有一个代理配置文件 其中有 API 网络服务 链接到目标以调用我们的数据库 此代理配置在本地使用正常工作npm 启动 现在我需要将此应用程序部署到 IIS 上的生产 Windows 服务器 我用了ng build and ng 构建 pr
  • 如何使用 CruiseControl.Net 构建忽略可执行文件的输出?

    我正在运行一个名为 fart exe 的小型查找和替换实用程序 是的 是放屁 如 查找和替换文本 中所示 作为我的 CC 构建的一部分 效果很好 问题是 FART 在工作时会显示一个由管道 破折号 斜线组成的小 ASCII 旋转器 没有办法
  • LINQ Join On Between 子句

    我在组合 LINQ 查询 将根据邮政编码连接表 时遇到一些问题 我需要根据客户的邮政编码是否位于由 ZIPBEG 和 ZIPEND 列确定的邮政编码范围内来加入表 T SQL 看起来像这样 JOIN ZipCodeTable zips ON
  • Angular 2 和浏览器自动填充

    我正在使用 Angular 反应式表单实现登录页面 如果表单无效 登录 按钮将被禁用 import Component OnInit from angular core import FormBuilder FormGroup Valida
  • C++“重载”if() 语句

    是否有可能改变if 以便 class Foo int x Foo foo if foo 仅当价值x是不是零的东西 或者 到 int 的显式用户定义类型转换是否有效 这是一种合适的方法吗 或者 最好做类似的事情if foo getX 您可以通
  • PIL 图像到 QPixmap 转换问题

    今天我一直在努力应对这一挑战 我已经利用之前的帖子和其他资源成功地获得了很好的观点 我正在尝试将 PIL Image 转换为 QPixmap 以便可以在 PyQT GUI 上使用 QgraphicsScene 进行显示 但是当图片显示时颜色
  • 异常和SQLException之间的区别

    有人可以解释一下捕捉和捕捉之间的区别吗 Exception并抓住一个SQLException 我知道如果你选择打印异常错误 SQLException会打印出更多信息 但是还有其他的吗 try code catch Exception ex
  • 如何使用 Android MediaCodec 生成 AAC ADTS 基本流

    我正在尝试做的事情 使用 Android 的 MediaCodec 将原始 PCM 音频样本编码为原始 AAC 文件 我遇到的问题是 当我使用 FFMPEG 将生成的原始 AAC 文件打包到 M4A 容器中时 FFMPEG 抱怨文件中缺少编
  • 无法在 Samsung 上将数据库从版本“n”降级到“n-1”

    我有一个带有数据库的应用程序 使用标准 SQLiteOpenHelper 创建和打开 每当我升级数据库版本时 我也会升级应用程序的版本代码 因此数据库没有办法下降 数据库版本号总是增加 从不减少 我通过设置禁用了应用程序中的数据库备份and