1

首先,让我说,这个异常不会经常发生,它只发生在我身上几次,不幸的是从来没有在电话连接和调试时发生。我得到的所有信息都来自用户发送给我的开发者控制台日志和应用程序日志。

首先,我得到的所有信息都来自开发者控制台:

Caused by: java.lang.NullPointerException

打电话时:

//private SQLiteDatabase mDb; initialized earlier
ContentValues args = new ContentValues();
args.put(KEY_ENABLED, isEnabled);

return mDb.update(DATABASE_TABLE, args, KEY_ROWID + "=" + rowId, null) > 0; //exception here

猜测它可能是由于 mDb 以某种方式为空引起的,我在这里添加了日志记录,以了解到底发生了什么

//DbAdapter 
public boolean updateIsAlarmChecked(long rowId, boolean isEnabled) {
try {
    ContentValues args = new ContentValues();
    args.put(KEY_ENABLED, isEnabled);

    return mDb.update(DATABASE_TABLE, args, KEY_ROWID + "=" + rowId, null) > 0;
} catch (Exception e) {
    Utils.log("updateIsAlarmChecked exception: " + e.getMessage());
    Utils.log("alarm enabled: " + isEnabled);
    Utils.log("db is " + (mDb == null ? "null" : "not null"));
    return false;
}
}

不幸的是,收到的日志包含:

updateIsAlarmChecked exception: null
alarm enabled: true
db is not null

所以看起来它是 SQLiteDatabase 内部的东西,但我怎样才能找出到底是什么?或者可能不是,因为开发者控制台没有显示该类中的任何痕迹?

我还将写出导致该错误的操作,也许这会有所帮助

  1. 应用程序正常工作(据我所知),活动 A 可见
  2. 用户编辑警报 - 打开新的 Activity B,其中有关警报的信息从新创建和打开的 DbAdapter 中读取(类类似于 NotePad Android 示例中的类,如果需要,我可能会提供更多代码)。
  3. 用户完成编辑,它们被正确保存,B 正在完成返回结果。它的 DbAdapter 在 onDestroy 中关闭(我刚刚注意到并且我知道这是不正确的,因为并不总是调用 onDestroy。这可能是错误的原因吗?但是我只是尝试在注释掉关闭的情况下运行并且没有发生错误)
  4. onActivityResult 在 A 中被调用,调用 A 的 DbAdapter 实例的 updateIsAlarmChecked(也许这个实例有时会变得“不正确”?)
  5. 发生异常并被捕获,更新不成功

有任何想法吗?非常感谢所有帮助


编辑:最新日志后的小更新。现在代码如下所示:

ContentValues args = null;
try {
    args = new ContentValues();
    args.put(KEY_ENABLED, isEnabled);
     return mDb.update(DATABASE_TABLE, args, KEY_ROWID + "=" + rowId, null) > 0; //null exception here
} catch (Exception e) {
    Utils.log("alarm enabled: " + isEnabled); //true
    Utils.log("alarm id= " + rowId); //there is alarm with this rowId
    Utils.log("db is " + (mDb == null ? "null" : "not null")); //not null
    Utils.log("args is " + (args == null ? "null" : "not null")); //not null
    Logger.logException(e);
    return false;
}

最糟糕的是,堆栈跟踪仅指向与返回语句一致 - 它不应该导致进一步“进入”更新方法吗?有什么想法我能用它做什么?太可怕了,它只是偶尔发生,我唯一能回复用户的是“再试一次,它只是有时会失败”......

4

1 回答 1

0

我认为您之所以会遇到这个问题,是因为您保存database! 在此链接中:SqliteSQLite没有单独的Boolean存储类。相反,Boolean值存储为integers0 ( false) 和 1 ( true)。因此,我认为您应该尝试将bool值保存为 0 或 1。

于 2012-09-06T09:53:42.687 回答