Android 更新SQLite数据库时出现问题
我有一个列表视图,它是从我的个人SQLite数据库填充的,它显示有关事件的信息。我正在尝试使用事件描述页面上的复选框创建一种喜爱此事件的方式。当用户选中复选框并启动onPause时,代码将尝试更新数据库 我查找了一些更新数据库中的行的示例,但无论我尝试什么,我似乎总是被NullPointerException卡住 如果您需要查看任何其他代码来帮助我解决此问题,请告诉我 以下是当用户离开描述活动以查看是否选中复选框时调用的代码:Android 更新SQLite数据库时出现问题,android,sql,sqlite,nullpointerexception,sql-update,Android,Sql,Sqlite,Nullpointerexception,Sql Update,我有一个列表视图,它是从我的个人SQLite数据库填充的,它显示有关事件的信息。我正在尝试使用事件描述页面上的复选框创建一种喜爱此事件的方式。当用户选中复选框并启动onPause时,代码将尝试更新数据库 我查找了一些更新数据库中的行的示例,但无论我尝试什么,我似乎总是被NullPointerException卡住 如果您需要查看任何其他代码来帮助我解决此问题,请告诉我 以下是当用户离开描述活动以查看是否选中复选框时调用的代码: @Override protected void onPause()
@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)
因此,问题的真正根源似乎很简单:您创建了一个新的dbHelper,但从未显式打开数据库。您看起来与标准非常接近。把它拉起来,看看NotesBadaptor是如何包装SQLiteOpenHelper的。在使用myDbHelper之前,需要调用myDbHelper.open 您应该做的另一个关键更改是遵循记事本示例中所示的相同模式。您应该将db作为一个成员变量—使用new初始化,然后在onCreate期间打开它。打开数据库可能需要半秒钟的时间。在初始化时做一次比在每次更改时做一次更好。请参阅Notepadv1.java中的示例
同样,这个记事本示例看起来与您所做的非常相似。在本教程的第2步中,他们会打开一个详细信息页面来编辑注释,就像您在您的计算机上打开一个详细信息页面一样。。。不管是什么。然后,步骤3精确地展示了如何使其在诸如onPause和onResume之类的生命周期事件方面具有健壮性。第一次做这件事是很棘手的。一步一步地了解他们的正确操作过程,并根据您的情况进行调整,您应该很快就会发现问题。ERROR/AndroidRuntime689:com.tagrost.AndroidConventionApp.DataBaseHelper.updateRowDataBaseHelper.java:198哪一行是198?这应该是问题所在。myDataBase.updateDATABASE_PANELS_TABLE,args,_id=+rowId,null;更大的问题是,为什么数据库更新与onPause有任何关系?打开活动时打开数据库,并保持其持久性。单击复选框并完成操作后,立即更新数据库。你是想用onPause强制重新绘制吗?我对android和java编程基本上是新手,所以我对某些函数的最佳实现方式并不十分精通。至于使用onPause,我找不到一个很好的例子来说明如何在复选框中使用侦听器。好吧,我错了。我没有看到这是在细节页面上。在这种用法中,onPause是一个很好的地方。但是,您应该始终保持数据库处于打开状态。我将演示如何: