【问题标题】:Problem updating a SQLite Database更新 SQLite 数据库的问题
【发布时间】:2011-03-04 20:19:45
【问题描述】:

我有一个从我的个人 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)

【问题讨论】:

  • ERROR/AndroidRuntime(689): at com.tagrost.AndroidConventionApp.DataBaseHelper.updateRow(DataBaseHelper.java:198) 198 是哪一行?这应该是问题所在。
  • myDataBase.update(DATABASE_PANELS_TABLE, args, "_id=" + rowId, null);
  • 一个更大的问题是,为什么数据库更新与 onPause 有任何关系?打开活动时打开数据库并使其保持不变。在您单击复选框并完成操作的那一刻更新数据库。您是否尝试使用 onPause 强制重绘?
  • 我对使用 android 和 java 编程很陌生,所以我并不完全精通使用某些功能的最佳方法。至于使用 onPause() 我找不到一个很好的例子来说明如何为复选框使用监听器。
  • 好吧,我错了。我没有看到这是在详细信息页面上。 onPause() 是在这种用法中执行此操作的好地方。但是,您应该始终保持数据库打开。我将展示如何:

标签: android sql sqlite nullpointerexception sql-update


【解决方案1】:

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

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

同样,这个记事本示例看起来与您正在做的事情非常相似。在本教程的第 2 步中,他们打开了一个详细信息页面来编辑注释,就像您在...上打开一个详细信息页面一样。不管它是什么。然后,第 3 步准确展示了如何使其在 onPause 和 onResume 等生命周期事件方面变得健壮。第一次做这件事很棘手。逐步完成他们正确处理的过程,并适应您的情况并做同样的事情,您应该很快就会学会。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-06
    • 1970-01-01
    • 1970-01-01
    • 2020-09-14
    • 2015-11-25
    • 2011-12-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多