应用程序第一次升级 sqlite 数据库时崩溃

2023-11-21

当第一次更新 sqlite 数据库时,我的应用程序遇到崩溃。重新加载应用程序,从此一切正常。我猜这与 onUpgrade 函数有关。我似乎无法找到问题出在哪里,非常感谢任何建议。提前致谢。

数据库助手:

public class DatabaseHelper extends SQLiteOpenHelper {

    private static String DB_PATH = "/data/data/jp.atomicideas.ne/databases/";
    private static String DB_NAME = "dataset";
    public static final int DB_VERSION = 2;
    private SQLiteDatabase myDataBase;
    private final Context myContext;
    public static final String EXPRESSION_TABLE = "expression";

    /**
     * Constructor
     * Takes and keeps a reference of the passed context in order to access
     * the assets and resources.
     * 
     * @param context
    */
    public DatabaseHelper(Context context) {
        super(context, DB_NAME, null, DB_VERSION);
        this.myContext = context;
    }

    /**
     * Creates an empty database on the system and rewrites with database from app
     * @throws IOException
    */
    public void createDataBase() throws IOException {
        boolean dbExist = checkDataBase();  
        // if the database already exists, do nothing
        if(dbExist){
            Log.v("DB Exists", "db exists");
            // by calling this method here, onUpgrade will be called on a writeable db, if version number is bumped
            this.getWritableDatabase();
        } 
        dbExist = checkDataBase();
        // if the database doesn't exist, copy the application's database to be used
        if(!dbExist) {
            this.getReadableDatabase();
            try {
                copyDataBase();
            } catch (IOException e) {
                throw new Error("Error copying database");
            }
        }
    }

    /**
     * Check if the database already exists to avoid re-copying the file
     * @return true only if it exists, falls if it doesnt
    */
    private boolean checkDataBase() {
        SQLiteDatabase checkDB = null;

        try {
            String mypath = DB_PATH + DB_NAME;
            checkDB = SQLiteDatabase.openDatabase(mypath, null, SQLiteDatabase.OPEN_READONLY);
        } catch(SQLiteException e) {
            // database does not exist yet
        }

        if(checkDB != null) {
            checkDB.close();
        }

        return checkDB != null ? true : false;
    }

    /**
     * Copies database from the local assets folder to the system folder
     * @throws IOException
    */
    private void copyDataBase() throws IOException {

        // Open the app database file as the input stream
        InputStream myInput = myContext.getAssets().open(DB_NAME);

        // Path to the empty temporary database to be replaced
        String outFileName = DB_PATH + DB_NAME;

        // Open the empty database file as the output stream
        OutputStream myOutput = new FileOutputStream(outFileName);

        // Transfer bytes from the input file to the output file
        byte[] buffer = new byte[1024];
        int length;
        while ((length = myInput.read(buffer)) > 0) {
            myOutput.write(buffer, 0, length);
        }

        // Close the streams
        myOutput.flush();
        myOutput.close();
        myInput.close();

    }

    public void openDataBase() throws SQLException {

        // Open the database
        String myPath = DB_PATH + DB_NAME;
        myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);
    }

    @Override
    public synchronized void close() {
        if(myDataBase != null)
            myDataBase.close();
        super.close();
    }

    @Override
    public void onCreate(SQLiteDatabase db) {

    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

        Toast.makeText(myContext, "onUpgrade called!", Toast.LENGTH_LONG).show();

        if (oldVersion < newVersion) {
            Log.v("Database Upgrade", "Database version higher, upgrading");
            myContext.deleteDatabase(DB_NAME);                          
        }
    }

}

这是 LogCat 输出:

06-28 20:52:07.638: V/DB Exists(26580): db exists
06-28 20:52:07.658: V/Database Upgrade(26580): Database version higher, upgrading
06-28 20:52:07.658: I/Database(26580): sqlite returned: error code = 1802, msg = statement aborts at 3: [PRAGMA user_version = 2] 
06-28 20:52:07.658: E/Database(26580): Failure 10 (disk I/O error) on 0x33a3f0 when executing 'PRAGMA user_version = 2'
06-28 20:52:07.658: I/Database(26580): sqlite returned: error code = 1, msg = statement aborts at 2: [ROLLBACK;] cannot rollback - no transaction is active
06-28 20:52:07.658: E/Database(26580): Failure 1 (cannot rollback - no transaction is active) on 0x33a3f0 when executing 'ROLLBACK;'
06-28 20:52:07.658: D/Database(26580): exception during rollback, maybe the DB previously performed an auto-rollback
06-28 20:52:07.668: D/AndroidRuntime(26580): Shutting down VM
06-28 20:52:07.668: W/dalvikvm(26580): threadid=1: thread exiting with uncaught exception (group=0x2aac8578)

AND

06-28 20:52:07.678: E/AndroidRuntime(26580): Caused by: android.database.sqlite.SQLiteDiskIOException: disk I/O error: PRAGMA user_version = 2

您不需要删除数据库,只需使用您已经定义的方法复制它即可(copyDataBase), 像这样:

@Override  
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {  
    Toast.makeText(myContext, "onUpgrade called!", Toast.LENGTH_LONG).show();  
    if (oldVersion < newVersion) {  
        Log.v("Database Upgrade", "Database version higher, upgrading");  
        try { 
            copyDataBase(); 
        } catch (IOException e) { 
            throw new Error("Error upgrading database"); 
        } 
    } 
}  
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

应用程序第一次升级 sqlite 数据库时崩溃 的相关文章

  • Android主线程的IO操作

    我的问题有两个 是否建议在 Android 的主线程上进行 IO 操作 或者它是否有可能导致我的应用程序崩溃 如果在主线程上执行 IO 操作不理想 我可以使用哪些其他框架 以便当我的应用程序加载时它可以执行一些基本的 IO 文件读取并将值存
  • 如何在android中显示对话框之外的图像?

    我试图在对话框片段的顶部显示配置文件图像 一半在图像之外 我在下面附加了示例对话框 就像那样 并尝试了旧 Stackoverflow 解决方案中的所有 FrameLayout 协作 但我无法存档此内容 请给我正确的解决方案 谢谢 Updat
  • 拖动时跳转 ImageView。 getX() 和 getY() 值正在跳跃

    我创建了一个用于拖动视图的 onTouchListener 如果我使用的话 图像可以顺利拖动getRawX and getRawY 问题是 当您向下放置第二个指针然后抬起第一个指针时 图像将跳转到第二个指针 此 onTouchListene
  • 改造中的多个队列导致内存不足错误?

    我正在使用retrofit2 做我的项目 当我的呼叫失败时 我再次重复相同的呼叫 重复此 呼叫使我的应用程序强制关闭 当我查看日志时 我得到了错误日志 如下所示 我觉得这是由于同一呼叫的多次排队造成的 所以我在排队之前就这样做了 我打电话给
  • 当路径的点超出视野时,Android Canvas 不会绘制路径

    我在绘制路径时遇到了 Android Canvas 的一些问题 我的情况是 我有一个相对布局工作 如地图视图 不使用 google api 或类似的东西 我必须在该视图上绘制一条路径 canvas drawPath polyPath bor
  • Fragment 问题中的 ExpandableListView

    我正在尝试在片段中实现可扩展列表视图 没有错误出现 当我尝试记录两个的输出时List
  • 如果使用grifika的ContinualCaptureActivity中的预览方式,相机预览的视野会更小

    我们知道 当相机预览比例设置为时 在相同距离下我们会得到更大的预览视野4 3代替16 9 具体如下 Android Camera API 奇怪的缩放效果 https stackoverflow com questions 20664628
  • 华为手机“受保护的应用程序”设置及处理方法

    我有一台搭载 Android 5 0 的华为 P8 用于测试应用程序 该应用程序需要在后台运行 因为它跟踪 BLE 区域 我发现华为内置了一个名为 受保护的应用程序 的 功能 可以从手机设置 电池管理器 gt 受保护的应用程序 访问该功能
  • 从ListView中隐藏行而不占用空间

    我有一个带有关联 ArrayAdapter 的 ListView 它在多个活动中显示其内容 不幸的是 现在有必要 我的 ListView 在其中一项设置中不显示其所有元素 而仅显示 属性 未设置为 true 的元素 我想避免使用两个具有不同
  • 透明 9patch 图像:显示出线条

    我得到了一个透明的 9 补丁图像 其中有 9 条补丁线显示槽 This is the output 显然我不希望水平线可见 这就是我创建 9patch 的方式 This is the final image that is used in
  • 选项卡主机内的 Android Fragment 视图状态 [重复]

    这个问题在这里已经有答案了 可能的重复 使用 Fragment 为 Android 中的每个选项卡单独的返回堆栈 https stackoverflow com questions 6987334 separate back stack f
  • 在新的 intel x86 android 模拟器中访问 google api

    我只是尝试在新的 x86 android 模拟器中运行我公司的应用程序 但是我们的应用程序依赖于 google 地图 API 而这在 google 随 android sdk 版本 17 提供的 x86 系统映像中不可用 我的直觉告诉我答案
  • 控制 OverlayItem 大小

    我正在构建一个在单个 ItemizedOverlay 中包含几十个 OverlayItems 的地图 我的地图设计为可以非常近距离地查看 大约缩放级别 18 并且 OverlayItems 彼此非常接近 地图放大时看起来不错 但是 如果用户
  • Android 上的 MIDI:Java 和/或 AIR 库

    一段时间以来 我一直在考虑在 iPad 上 重新 构建一个应用程序 其中我将使用 Objective C 和DSMI http dsmi tobw net 将 MIDI 信号发送到主机 这还不错 我的意思是 除了实际编写应用程序之外 现在我
  • 如何为我的 Android Market APK 创建证书?

    我想将我的第一个 APK 应用程序上传到 Android Market 但我收到了此错误 顺便说一下 在 stackoverflow 中搜索时并没有引导我找到正确的链接 市场不接受使用调试证书签名的 APK 创建有效期至少 50 年的新证书
  • Android NDK 代码中的 SIGILL

    我在市场上有一个 NDK 应用程序 并获得了有关以下内容的本机崩溃报告 SIGILL信号 我使用 Google Breakpad 生成本机崩溃报告 以下是详细信息 我的应用程序是为armeabi v7a with霓虹灯支持 它在 NVIDI
  • 无法使用 findViewById() 找到视图

    我找不到TextView通过致电findViewById 即使 ID 确实存在 OtherActivity public class OtherActivity extends Activity Override protected voi
  • sqlite3和pdo_sqlite有什么区别

    我正在将我的 Web 应用程序从 MySQL 迁移到 SQLite 数据库 我发现有两个 PHP 扩展用于与 sqlite 通信 php sqlite3 dll and php pdo sqlite dll 什么扩展比较好 或者另一个问题
  • 如何更改操作栏背景和文本颜色

    我正在使用本教程中的导航抽屉 http www androidhive info 2013 11 android sliding menu using navigation drawer http www androidhive info
  • LifeCycleAware Fragment 中的片段生命周期事件

    我有一个生命周期感知片段和一个LifecycleObserver class public class MyFragment extends Fragment Override public void onCreate Nullable B

随机推荐

  • 添加 runat="server" 会更改布局的行为

    我有一个带有一些控件 用户控件等的页面 当我从普通更改 div 时 div to a div 布局完全改变 这是为什么 我该如何预防 我正在使用 2 0 NET 框架 是因为 NET 改变了我的 id 这显然是我不想要的吗 如果您在 CSS
  • 除法和浮点数

    任何人都可以帮助我为什么 x2 打印零 我想因为浮点表示 X1 被四舍五入 有没有办法保持进动 long double x1 x2 x1 0 087912088 Note 360 4095 0 087912088 x2 360 4095 p
  • 使用 Admob 在 Android 中实现原生广告?是否可以?

    我正在尝试在我的 Android 应用程序中实现原生广告 但我只想使用 admob 来做到这一点 我搜索了很多解决方案 但找不到确切的解决方案 我知道可以使用MoPub What I wanted to do is this Show ad
  • 如何下载整个 pypi Python 包索引

    我正在尝试找到一种方法来下载整个 PyPi 索引 并且仅下载索引 没有代码文件 我想分析许可证类型 以便能够排除许可证类型限制过多的库 我已经在网上查看并浏览了用户指南 但如果答案就在那里 我却无法理解 嗯 你可以使用PyPi 的简单索引无
  • CSS 属性选择器 + 后代在 Webkit 中出现错误?

    考虑这个 CSS data color red h1 background color red data color blue h1 background color blue 还有这个 HTML div h1 red h1 div div
  • 使用 Firebase-UI (Android) 的 Firestore 聊天应用

    我正在尝试使用 Cloud Firestore 的 Firebase UI 库创建聊天 Thisgithub存储库包含我正在使用的相关代码 问题在于查询的顺序 看到查询被指定为 Query sChatQuery sChatCollectio
  • Castle Windsor IoC 属性注入简单操作方法

    好吧 我想也许有too much有关温莎城堡的信息 因为寻找这些关键字可以为我提供所有内容的示例 坦率地说 我不太了解它如何工作以正确解决此问题 我已经尝试了很多排列 但运气不佳 我有一个IUnitOfWorkFactory我想实例化为单例
  • 如何在 Xcode 5 上找到 arm-apple-darwin#-llvm-gcc-4.2 编译器?

    我正在绑定一个交叉编译 为此我需要找到 Xcode 放置 arm gcc 编译器的位置 它曾经位于 Applications Xcode app Contents Developer Platforms iPhoneOS platform
  • 在 k8s 中使用本地 docker 镜像,无需设置注册表

    我已经根据以下内容设置了单节点 kubernetes官方教程 除了官方文档之外 我还设置了单节点集群 kubectl taint nodes all node role kubernetes io master 残疾人驱逐限制 cat lt
  • Treeview ContainerFromItem 始终返回 null

    我已经阅读了有关此主题的一些主题 但找不到任何可以做我想做的事情 我有一个绑定到一组分层对象的树视图 这些对象中的每一个都代表地图上的一个图标 当用户单击地图上的某个图标时 我想在树视图中选择该项目 将焦点放在它上 然后将其滚动到视图中 地
  • 如何制作可扩展 Flutter 小部件的动画以将其滑出屏幕

    我有两个连续的可扩展按钮占据了整个屏幕宽度 单击左侧按钮时 我希望左侧按钮占据整个屏幕宽度 右侧按钮通过向右滑动到屏幕外而消失 这是我到目前为止所取得的成就 正如您所注意到的 当没有足够的空间来渲染右侧按钮时 它会在最后被压扁 我只是希望它
  • Django Rest Framework 数据库错误异常处理

    有没有办法让 Django Rest Framework 自动响应HTTP 400 STATUS什么时候出现数据库异常 IntegrityError等等 示例 我有一个具有唯一用户名字段的模型 并且我正在尝试使用通用的rest framew
  • 将文件转换为 Base64String 并再次转换回来

    标题说明了一切 我像这样读了 tar gz 存档 将文件分解为字节数组 将这些字节转换为 Base64 字符串 将 Base64 字符串转换回字节数组 将这些字节写回到新的 tar gz 文件中 我可以确认两个文件的大小相同 以下方法返回
  • 强制元素水平对齐

    假设我的 div 中有随机的子元素 其固定高度和宽度设置为 100 以便与布局同步 我必须使用哪种 CSS 来强制子元素水平对齐 并且当 div 的宽度小于内容时 显示滚动条并且不相互重叠 Fiddle http jsfiddle net
  • 如何更改 PostgreSQL 数据库表中列的位置?

    我尝试了以下方法 但没有成功 ALTER TABLE person ALTER COLUMN dob POSITION 37 改变列位置 在 PostgreSQL Wiki 中说道 PostgreSQL 目前定义了列 订单基于attnum的
  • 如何使用 Karma Runner(又名 Testaulous)提供 svg 和固定装置

    在过去的两个小时里 我一直在尝试让 Karma runner 提供 svg 文件和 html 固定装置 但到目前为止还没有成功 根据该线程的第二个答案 将 html 与 testaulousjs 集成时出错我一直在尝试使用served表明我
  • 使用 shell 脚本合并两个属性文件

    如何合并两个属性文件 例如使用 shell 脚本 如果我有两个属性文件 例如 first properties test file anish test version 3 0 second properties test author n
  • 通过单击并拖动来“检查”多个复选框?

    我有一个充满复选框的表格 如下所示 我希望能够按住鼠标并拖动以激活多个复选框 我不知道从哪里开始 我寻找答案 但只找到了另一个线程有人询问如何做 但没有答案 HTML table tbody tr td td tr tbody table
  • 在 JavaFX 2.2 桌面应用程序中嵌入 Google 地图会引发异常并且通常无法执行

    我有一个项目需要在桌面java应用程序中嵌入谷歌地图 经过一番研究后 我发现 Java FX 确实提供了此功能 并继续编写了一个示例应用程序作为 PoC 应用程序运行正常 一切都很好 升级到新的 7u7 java 版本后 我的代码不再像以前
  • 应用程序第一次升级 sqlite 数据库时崩溃

    当第一次更新 sqlite 数据库时 我的应用程序遇到崩溃 重新加载应用程序 从此一切正常 我猜这与 onUpgrade 函数有关 我似乎无法找到问题出在哪里 非常感谢任何建议 提前致谢 数据库助手 public class Databas