SQLiteAssetHelper NullPointerException 仅在某些设备上

2024-03-27

我正在使用 SQLiteAssetHelper 库来处理我的 App DB 操作,它对于我测试过的几乎所有手机都运行良好。然而,一些使用 Android 2.3.3 - 2.3.7 的用户报告在调用打开数据库时崩溃。我怀疑这是由于第一次从资产文件夹复制数据库时发生的一些问题(例如内部存储空间不足)。

辅助类:

public class DbHelper extends SQLiteAssetHelper {

    final static String DB_NAME="db";
    static final int DB_VERSION = 1307181213;
    final Context context;

    public DbHelper(Context c) {
        super(c, DB_NAME, null, DB_VERSION);
        this.context = c;
        setForcedUpgradeVersion(DB_VERSION);
    }
}

处理程序类(如果无法打开数据库,我将计数器设置为在 10 秒后超时) :

public class DbHandlerDao {

    private SQLiteDatabase database;
private DbHelper dbHelper;

public DbHandlerDao(Context context) {
    dbHelper = new DbHelper(context);
}

public void open() throws SQLException {
    boolean opened = false;
    int timeout = 0;
    while (!opened && timeout < 10000) {
        try {
            database = dbHelper.getReadableDatabase();
            opened = true; 
        }
        catch (IllegalStateException e) {
            timeout += 500;
            try {
                Thread.sleep(500);
            } catch (Exception e2) {

            }
        }
    }
}

public void close() {
    dbHelper.close();
}

调用类:

private class DbAsyncTask extends AsyncTask<Long, Void, Void> {

        //...

        @Override
        protected Void doInBackground(Long... params) {
            dataHandler.open();

例外:

java.lang.RuntimeException: An error occured while executing doInBackground()
    at android.os.AsyncTask$3.done(AsyncTask.java:200)
    at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:274)
    at java.util.concurrent.FutureTask.setException(FutureTask.java:125)
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:308)
    at java.util.concurrent.FutureTask.run(FutureTask.java:138)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
    at java.lang.Thread.run(Thread.java:1019)
Caused by: java.lang.NullPointerException
    at com.readystatesoftware.sqliteasset.SQLiteAssetHelper.getWritableDatabase(SQLiteAssetHelper.java:180)
    at com.readystatesoftware.sqliteasset.SQLiteAssetHelper.getReadableDatabase(SQLiteAssetHelper.java:257)
    at com.example.DbHandlerDao.open(DbHandlerDao.java:25)
    at com.example.SearchActivity$DbAsyncTask.doInBackground(SearchActivity.java:244)
    at com.example.SearchActivity$DbAsyncTask.doInBackground(SearchActivity.java:1)
    at android.os.AsyncTask$2.call(AsyncTask.java:185)
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306)

可能用户已经清除了存储空间或者没有 SD 卡?

可能是发生了零星的崩溃。

** 你实现了 oncreate 和 onupgrade 方法吗?

我使用开放式助手。所以我打开数据库从来没有遇到问题。

 public class RidesDatabaseHandler extends SQLiteOpenHelper {

...

    // Creating Tables
@Override
public void onCreate(SQLiteDatabase db) {
    String CREATE_CONTACTS_TABLE = "CREATE TABLE " + TABLE_RIDES + "("
            + KEY_ID + " INTEGER PRIMARY KEY," + KEY_NAME + " TEXT,"
            + KEY_DESCRIPTION + " TEXT," + KEY_BOUNDS_NELAT + " TEXT,"
            + KEY_BOUNDS_NELONG + " TEXT," + KEY_BOUNDS_SWLAT + " TEXT,"
            + KEY_BOUNDS_SWLONG + " TEXT," + KEY_RESRAWID + " TEXT,"
            + KEY_RESDRAWABLEID + " TEXT," + KEY_PATH + " TEXT,"
            + " CONSTRAINT UNQ_" + KEY_PATH + " UNIQUE (" + KEY_PATH
            + ") ON CONFLICT ABORT)";

    // VERSION 43 ADDS THE KEY_DATE_UPDATE COLUMN
    CREATE_CONTACTS_TABLE += " , " + KEY_DATE_UPDATE + " INTEGER DEFAULT 0";

    db.execSQL(CREATE_CONTACTS_TABLE);
}

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

    int upgradeTo = oldVersion + 1;
    while (upgradeTo <= newVersion) {
        switch (upgradeTo) {
        // update old resrawid's to constants
        // this was caused when I saved R values in the database
        // and then later realized they would change.
        // the old resrawid is changed to a constant.
        case 42:
            ContentValues values;
            @SuppressWarnings("unused")
            // used for debugging so I can see the value of the update.
            int res;
            int rs;
            rs = 2130968576;
            values = new ContentValues();
            values.put(
                    KEY_RESRAWID,
                    com.gosylvester.bestrides.ImageTextListViewActivity.SAMPLE_DRAGON);
            res = db.update(TABLE_RIDES, values, KEY_RESRAWID + " = ?",
                    new String[] { String.valueOf(rs) });

            rs = 2130968577;
            values = new ContentValues();
            values.put(
                    KEY_RESRAWID,
                    com.gosylvester.bestrides.ImageTextListViewActivity.SAMPLE_M119);
            res = db.update(TABLE_RIDES, values, KEY_RESRAWID + " = ?",
                    new String[] { String.valueOf(rs) });

            rs = 2130968578;
            values = new ContentValues();
            values.put(
                    KEY_RESRAWID,
                    com.gosylvester.bestrides.ImageTextListViewActivity.SAMPLE_MEDINA);
            res = db.update(TABLE_RIDES, values, KEY_RESRAWID + " = ?",
                    new String[] { String.valueOf(rs) });
            break;
        case 43:
            // new column added for last_viewed.
            db.execSQL(VERSION_43_ALTER);
            break;

        case 44:
            // new index on KEY_DATE_UPDATE DESC
            db.execSQL(VERSION_44_CREATE_INDEX);
        }
        upgradeTo++;
    }

祝你好运

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

SQLiteAssetHelper NullPointerException 仅在某些设备上 的相关文章

  • Android Room ORM:支持 SQLite 的自定义构建

    我需要使用 SQLite 的自定义构建 基于 sqlite org 版本https sqlite org android doc trunk www index wiki https sqlite org android doc trunk
  • 如何在再次恢复应用程序时不重新加载webview?

    我做了一个网络视图应用程序 一切都运转良好 但是 当用户点击后退按钮并打开 恢复 应用程序时 它会重新加载 Web 视图 我该如何预防呢 MainActivity java public class MainActivity extends
  • 在Android中使用RxJava2插入SQLiteDatabase

    我在学习RxJava2在安卓中 谁能解释一下我们如何使用将数据插入 SQLiteDatabaseRxJava2 这是我尝试使用的代码示例 但它将数据插入数据库六次 单击时 getCompletableObservable subscribe
  • 如何解决:无法解析: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版本App更新代码

    我读到如果我们想更新Google Play中的应用程序 版本代码应该高于以前的apk文件 我有一个版本代码为 20 且版本名称为 1 0 的应用程序 那么要更新app 应该如何增加版本号呢 应该增加10吗 或者仅仅 1 就足够了 即版本代码
  • Android 从 C++ 端播放原始音频

    我需要能够在 Android 系统的 C 端以自定义文件格式传输音频 我正在致力于移植自定义媒体播放器 并且需要能够打开自定义文件并从中传输音频 这很重要 因为我认为从性能角度来看将整个播放器移植到 JAVA 是不可行的 并且通过 JNI
  • Auto-value-gson出现接口错误,注册一个InstanceCreator?

    我有一个如下所示的接口类 public interface Species String name And a Human实现的类 AutoValue使用类型适配器 AutoValue public abstract class Human
  • 多种语言的多种字体

    我最近在开发应用程序时遇到了一种情况 我必须在文本视图中显示不同的语言 目前我正在展示一些使用字体 字体像这样 Typeface tf Typeface createFromAsset this getAssets DroidHindi t
  • Android studio - 如何保存先前活动中选择的数据

    这是我的代码片段 这Textview充当按钮并具有Onclicklistner在他们 当cpu1000时Textview单击它会导致cpu g1000其代码如下所示的类 public class Game 1000 extends AppC
  • 如何在单个查询中搜索 RealmObject 的 RealmList 字段

    假设我有一堂课 public class Company extends RealmObject private String companyId private RealmList
  • Android Gradle 问题 - Flutter / Dart

    我的 Gradle 同步有问题 我使用 IntelliJ 和 Android Studio 构建 Flutter Dart 应用程序 我添加了 2 个新的依赖项 现在 Gradle 出现了问题 在 Android Studio 中一切正常
  • 如何使用 Retrofit 解析嵌套 json....?

    我不知道该怎么办使用 Retrofit 解析 json 熟悉使用 Retrofit 解析简单的 json 但不熟悉解析嵌套Json using Retrofit 这是我的 Json 数据 current observation image
  • Android 无法解析日期异常

    当尝试解析发送到我的 Android 客户端的日期字符串时 我得到一个无法解析的日期 这是例外 java text ParseException 无法解析的日期 2018 09 18T00 00 00Z 位于 偏移量 19 在 java t
  • 以编程方式向 LinearLayout 添加边框

    我该如何添加以编程方式LinearLayout 的边框 假设我们创建了这个布局 LinearLayout TitleLayout new LinearLayout getApplicationContext TitleLayout setO
  • React Native HTTPS Api 调用在 IOS 中有效,但在 Android 中无效

    所以基本上我所做的就是简单地对启用了 HTTPS 的 UAT 服务器进行简单的 Axios 调用 我已经在 IOS 中测试了整个应用程序 API 调用工作正常 但一旦我在 Android 中测试了相同的应用程序 在真正的 Android 设
  • android系统用户和linux root用户有什么区别

    当我将手机连接到电脑并使用adb shell与我的手机通信并输入的命令ps命令输出当前在我的手机上运行的进程信息 我发现有两个特殊用户 一个是root 另一个是system 据我所知 Android是基于linux的 所以root用户是最大
  • 如何在android中安装和使用couch db

    我应该如何在 android 中安装和使用 couch Db 我的意思是本地沙发数据库 我可以在平板电脑和模拟器中使用它 为此我必须遵循哪些步骤 我目前正在开发一个使用它的项目 有两种选择 1 couchbase android 是的 co
  • Android View Canvas onDraw 未执行

    我目前正在开发一个自定义视图 它在画布上绘制一些图块 这些图块是从多个文件加载的 并将在需要时加载 它们将由 AsyncTask 加载 如果它们已经加载 它们只会被绘制在画布上 这工作正常 如果加载了这些图片 AsyncTask 就会触发v
  • ARM Chromebook 上的 Android 开发环境?

    我尝试了多次安装和使用安卓工作室 https developer android com studio index html on an ARM Chromebook C100P https archlinuxarm org platfor
  • View.post(),以及当Runnables被执行时

    我最初的问题是需要知道我的根的高度和宽度View这样我就可以进行程序化的布局更改 就我的目的而言 我不一定需要在onCreate 对于我来说 以编程方式添加我的孩子就足够了View根布局完成后 因此我很乐意使用onWindowFocusCh

随机推荐

  • 安全跨线程信号/槽 C++

    似乎唯一为 Signal 类和槽中调用的内容提供安全跨线程信号的实现是 QT 也许我错了 但我不能在我正在做的项目中使用QT 那么我如何从不同的线程提供安全的 Slots 调用 例如使用 Boost signals2 插槽内的互斥体是唯一的
  • React Hooks with typescript:类型上不存在属性“数据”

    我有一个没有意义的错误 我正在用钩子输入我的状态值 但他说错误不是同一类型 已经尝试过使用空数组 甚至使用一些数据的数组 但错误总是相同的 import React useState from react import Row Col fr
  • 仅更新 DateTime 的日期部分

    我正在使用 SQL Server 2008 我在数据库中有一个日期时间 值为 10 4 2012 8 03 00 AM 如何仅更新日期部分 字段名称为 dTime 我想将日期更新为 10 5 2012 并保持时间不变 UPDATE tabl
  • 如果 bean 已经使用 @ConfigurationProperties 注解,@EnableConfigurationProperties 会有什么区别?

    Spring Boot 文档 https docs spring io spring boot docs 2 1 3 RELEASE reference html boot features external config html boo
  • 设置自定义 Maven 2 属性的默认值

    我有一个 Maven pom xml 其中包含一个我希望能够在命令行上控制的插件 一切工作正常 除了即使在网上搜索了一段时间后 我也不知道如何为我的控件属性设置默认值
  • 如何将 Cocoa 坐标从左上角 == 原点转换为左下角 == 原点

    我使用 CGWindowListCopyWindowInfo 来获取所有窗口的列表 它根据原点为我提供每个窗口的坐标top left屏幕的 如果我使用 NSWindow 的 setFrame 方法 则坐标基于原点左下方屏幕的 从一种方式转换
  • WPF 列表框滚动条不起作用

  • Backbone 可以逆序渲染集合吗?

    我正在使用 Signalr 中心来订阅服务器上的事件 事件被分派到集线器 它成功地将项目添加到 Marionette CollectionView 这又被呈现到表格中 因为事件表本质上是一个记事本 所以我希望事件按相反的顺序排列 并且最好只
  • 成本计算器应用程序的设计模式?

    我有一个问题 我之前曾尝试寻求帮助 但当时无法解决它 所以我现在尝试简化问题 看看是否可以获得更具体的帮助 因为它让我发疯了 基本上 我有这个应用程序的工作 更复杂 版本 它是一个项目成本计算器 但因为我同时尝试学习更好地设计我的应用程序
  • iPhone 后台线程问题

    我正在使用后台线程来更新我的标签之一 我正在使用以下代码 但在 iOS 4 0 中 我了解到应用程序会保存其状态并进入后台 我的应用程序也做了这项工作 但是当我隐藏应用程序时 我正在使用的线程停止工作 并在我重新打开它时从我离开的位置恢复
  • IE8 支持哪些 Javascript 版本?

    根据维基百科 IE8仅支持Javascript 1 5 所以他们说 IE8 完全忽略了 Javascript 版本 1 6 1 7 1 8 和 1 9 我应该相信吗 这是真的吗 好吧 实际上 IE 的实现叫做JScript http msd
  • runBlock 发生后延迟 SKAction.sequence 中的下一个操作(Swift)?

    The duration财产为moveTo在 a 内时不被跟随runBlock 允许序列中的后续操作立即执行 而该操作应该只在之后执行duration秒 代码A 正确执行的序列 let realDest CGPointMake itemA
  • Ansible - 如何将 selectattr 与不同键的 yaml 一起使用

    我正在努力尝试做一件简单的事情 我认为这应该很容易 解析 yaml 并过滤 Ansible 中的某些键 我的 yaml 文件如下所示 vm vm1 ip 10 10 10 1 vm vm2 ip 10 10 10 2 test vm som
  • 清空表数据并重置 IDENTITY 列

    我在 SQL Server 中创建了一个包含几个表的数据库 我运行了一些测试 现在准备部署我的解决方案 问题是 表中有各种各样的数据 我想删除通过测试创建的所有表的每一行 并将主键放回到零 我尝试删除它不会重置主键索引 并且删除只是破坏了表
  • 如何使带有换行符的行内元素的背景延伸到每边最远的边缘?

    即使使用容器 我也不知道如何做到这一点 内联容器的背景将缩小到每行的大小 内联块容器将就像块元素一样 浮动似乎也不起作用 Example div style width 250px margin left 0px border 2px so
  • 如果在python中单独写一个变量名会发生什么?

    最近我开始好奇以下伪 python 代码的第 2 行发生了什么 def my fun foo bar foo return foo bar 我开始感兴趣的原因是我正在尝试 Light Table 并尝试在 foo 上放置一个手表 它似乎导致
  • C++ 将函数指针转换为唯一的“哈希”键

    Se 原始问题在底部 我想我明白你们现在在说什么 因为成员函数指针的内部结构是编译器 机器特定的 所以我实际上不可能做到这一点 因此 即使它在我测试时有效 我也不能保证它在其他编译器 机器上也有效 那么还有其他方法可以实现我想要的吗 我有一
  • tr1::reference_wrapper 有什么用?

    最近我读了斯科特 迈耶斯 Scott Meyers 的优秀著作有效的C https rads stackoverflow com amzn click com 0321334876书 在最后一篇技巧中 他介绍了 TR1 的一些功能 我通过
  • 如何通过代理 servlet 捕获服务器发送事件 (SSE)

    我们维护2个应用程序 application1在具有proxyservlet的glassfish服务器中运行 application2在同一台机器上与jetty服务器一起运行 我的 UI 代码发出请求 gt app1 proxyservle
  • SQLiteAssetHelper NullPointerException 仅在某些设备上

    我正在使用 SQLiteAssetHelper 库来处理我的 App DB 操作 它对于我测试过的几乎所有手机都运行良好 然而 一些使用 Android 2 3 3 2 3 7 的用户报告在调用打开数据库时崩溃 我怀疑这是由于第一次从资产文