我有一个列表视图,它是从我的个人SQLite DB中填充的,显示有关事件的信息。我正在尝试使用事件描述页面上的复选框创建一种“喜欢”此事件的方法。当用户选中复选框,然后启动onPause()
时,代码将尝试更新数据库我已经查找了一些更新数据库中行的示例,但无论我尝试什么,我似乎总是遇到NullPointerException。
如果您需要查看其他任何代码以帮助我解决此问题,请告诉我。
以下是当用户离开描述活动时我调用的代码,看看他们是否已经选中了复选框:
@Override
protected void onPause() {
super.onPause();
DataBaseHelper myDbHelper = new DataBaseHelper(this);
if (panelCheckBox.isChecked()) {
int mySchedule = 1;
myDbHelper.updateRow(mRowId, mySchedule);
}
这是DataBaseHelper中的updateRow代码
public void updateRow(long rowId, Integer mySchedule) {
if(mySchedule != null){
ContentValues args = new ContentValues();
args.put("mySchedule", mySchedule);
myDataBase.update(DATABASE_PANELS_TABLE, args, "_id=" + rowId, null);
}
}
这是来自logcat的错误:
ERROR/AndroidRuntime(689): Uncaught handler: thread main exiting due to uncaught exception
ERROR/AndroidRuntime(689): java.lang.RuntimeException: Unable to pause activity {com.tagrost.AndroidConventionApp/com.tagrost.AndroidConventionApp.PanelDescActivity}: java.lang.NullPointerException
ERROR/AndroidRuntime(689): at android.app.ActivityThread.performPauseActivity(ActivityThread.java:3162)
ERROR/AndroidRuntime(689): at android.app.ActivityThread.performPauseActivity(ActivityThread.java:3119)
ERROR/AndroidRuntime(689): at android.app.ActivityThread.handlePauseActivity(ActivityThread.java:3102)
ERROR/AndroidRuntime(689): at android.app.ActivityThread.access$2400(ActivityThread.java:119)
ERROR/AndroidRuntime(689): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1874)
ERROR/AndroidRuntime(689): at android.os.Handler.dispatchMessage(Handler.java:99)
ERROR/AndroidRuntime(689): at android.os.Looper.loop(Looper.java:123)
ERROR/AndroidRuntime(689): at android.app.ActivityThread.main(ActivityThread.java:4363)
ERROR/AndroidRuntime(689): at java.lang.reflect.Method.invokeNative(Native Method)
ERROR/AndroidRuntime(689): at java.lang.reflect.Method.invoke(Method.java:521)
ERROR/AndroidRuntime(689): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860
ERROR/AndroidRuntime(689): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
ERROR/AndroidRuntime(689): at dalvik.system.NativeStart.main(Native Method)
ERROR/AndroidRuntime(689): Caused by: java.lang.NullPointerException
ERROR/AndroidRuntime(689): at com.tagrost.AndroidConventionApp.DataBaseHelper.updateRow(DataBaseHelper.java:198)
ERROR/AndroidRuntime(689): at com.tagrost.AndroidConventionApp.PanelDescActivity.onPause(PanelDescActivity.java:67)
ERROR/AndroidRuntime(689): at android.app.Activity.performPause(Activity.java:3782)
ERROR/AndroidRuntime(689): at android.app.Instrumentation.callActivityOnPause(Instrumentation.java:1190)
ERROR/AndroidRuntime(689): at android.app.ActivityThread.performPauseActivity(ActivityThread.java:3149)
答案 0 :(得分:0)
因此,问题的真正根本原因似乎很简单:您创建了一个新的dbHelper,但您从未显式打开数据库。您希望与标准Android Notepad tutorial紧密相关。拉起来看看NotesDbAdaptor
如何包裹SQLiteOpenHelper
。你需要调用myDbHelper.open()才能使用myDbHelper。
您应该做的另一个关键更改是遵循记事本示例中显示的相同模式。您应该将db保留为成员变量 - 使用new初始化,然后在onCreate()期间打开它。 (打开数据库可能需要半秒钟。在每次更改时,最好在init上执行一次。)请参阅Notepadv1.java中的示例。
同样,这个记事本样本看起来与你正在做的非常接近。在本教程的第2步中,他们打开了一个详细信息页面来编辑注释,就像你打开一个详细信息页面一样......无论它是什么。然后,第3步显示了如何在onPause和onResume等生命周期事件方面使其健壮。第一次这样做时很棘手。按照他们的步骤逐步完成,并适应你的情况并做同样的事情,你很快就会把它拿起来。