1

まず、この例外は定期的には発生しません。私には数回しか発生しませんでしたが、残念ながら、電話が接続されてデバッグされたときは発生しませんでした。私が入手したすべての情報は、ユーザーから送信された開発者コンソールのログとアプリのログからのものです。

まず、私が得たすべての情報は、DeveloperConsoleからのものでした。

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がnullであることが原因である可能性があると推測して、正確に何が起こっているかを知るために、ここにロギングを追加しました

//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内にあるように見えますが、正確に何を見つけることができますか?または、Developer Consoleがそのクラス内からのトレースを表示しなかったため、そうではないでしょうか。

また、そのエラーの原因となるアクションについても説明します。おそらくそれが役立つでしょう。

  1. アプリケーションは正常に動作しています(私が知る限り)、アクティビティAは表示されています
  2. ユーザーがアラームを編集します-新しいアクティビティ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;
}

最悪なのは、トレースポイントをreturnステートメントの行にのみスタックすることです。これにより、更新メソッドがさらに「進む」べきではないでしょうか。それで私にできることはありますか?それはたまにしか起こらないのはひどいことであり、私がユーザーに返信できるのは「もう一度やり直してみてください、たまにしか失敗しない」ということだけです...

4

1 に答える 1

0

database!を保存する方法が原因で、その問題が発生すると思います。このリンク: Sqliteには、個別のストレージ クラスSQLiteがありません。Boolean代わりに、Boolean値はintegers0 ( false) および 1 ( )として格納されtrueます。boolしたがって、値を 0 または 1 として保存するようにしてください。

于 2012-09-06T09:53:42.687 に答える