更新SQLite数据库时出现问题

时间:2011-03-04 20:19:46

标签: android sql sqlite nullpointerexception sql-update

我有一个列表视图,它是从我的个人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)

1 个答案:

答案 0 :(得分:0)

因此,问题的真正根本原因似乎很简单:您创建了一个新的dbHelper,但您从未显式打开数据库。您希望与标准Android Notepad tutorial紧密相关。拉起来看看NotesDbAdaptor如何包裹SQLiteOpenHelper。你需要调用myDbHelper.open()才能使用myDbHelper。

您应该做的另一个关键更改是遵循记事本示例中显示的相同模式。您应该将db保留为成员变量 - 使用new初始化,然后在onCreate()期间打开它。 (打开数据库可能需要半秒钟。在每次更改时,最好在init上执行一次。)请参阅Notepadv1.java中的示例。

同样,这个记事本样本看起来与你正在做的非常接近。在本教程的第2步中,他们打开了一个详细信息页面来编辑注释,就像你打开一个详细信息页面一样......无论它是什么。然后,第3步显示了如何在onPause和onResume等生命周期事件方面使其健壮。第一次这样做时很棘手。按照他们的步骤逐步完成,并适应你的情况并做同样的事情,你很快就会把它拿起来。