Android SQLite空指针exception

我在LogCat中得到这个:

05-20 17:16:34.721: E/AndroidRuntime(30461): FATAL EXCEPTION: main 05-20 17:16:34.721: E/AndroidRuntime(30461): java.lang.NullPointerException 05-20 17:16:34.721: E/AndroidRuntime(30461): at android.database.sqlite.SQLiteStatement.releaseAndUnlock(SQLiteStatement.java:290) 05-20 17:16:34.721: E/AndroidRuntime(30461): at android.database.sqlite.SQLiteStatement.executeUpdateDelete(SQLiteStatement.java:96) 05-20 17:16:34.721: E/AndroidRuntime(30461): at android.database.sqlite.SQLiteDatabase.updateWithOnConflict(SQLiteDatabase.java:1810) 05-20 17:16:34.721: E/AndroidRuntime(30461): at android.database.sqlite.SQLiteDatabase.update(SQLiteDatabase.java:1761) 05-20 17:16:34.721: E/AndroidRuntime(30461): at com.kickinglettuce.debtplannerpro.DebtDataSource.updateDebt(DebtDataSource.java:130) 05-20 17:16:34.721: E/AndroidRuntime(30461): at com.kickinglettuce.debtplannerpro.manageDebts$4.onClick(manageDebts.java:184) 05-20 17:16:34.721: E/AndroidRuntime(30461): at android.view.View.performClick(View.java:3511) 05-20 17:16:34.721: E/AndroidRuntime(30461): at android.view.View$PerformClick.run(View.java:14105) 05-20 17:16:34.721: E/AndroidRuntime(30461): at android.os.Handler.handleCallback(Handler.java:605) 05-20 17:16:34.721: E/AndroidRuntime(30461): at android.os.Handler.dispatchMessage(Handler.java:92) 05-20 17:16:34.721: E/AndroidRuntime(30461): at android.os.Looper.loop(Looper.java:137) 05-20 17:16:34.721: E/AndroidRuntime(30461): at android.app.ActivityThread.main(ActivityThread.java:4447) 05-20 17:16:34.721: E/AndroidRuntime(30461): at java.lang.reflect.Method.invokeNative(Native Method) 05-20 17:16:34.721: E/AndroidRuntime(30461): at java.lang.reflect.Method.invoke(Method.java:511) 05-20 17:16:34.721: E/AndroidRuntime(30461): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 05-20 17:16:34.721: E/AndroidRuntime(30461): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 05-20 17:16:34.721: E/AndroidRuntime(30461): at dalvik.system.NativeStart.main(Native Method) 

这是与它相关的代码:

 protected void onListItemClick(ListView l, View v, int position, long id) { List<Debt> values = datasource.getAllDebt(); datasource.open(); Debt item = values.get(position); final long boxId = item.getId(); // final String BoxId = String.valueOf(boxId); final String BoxName = item.getName(); final String BoxBalance = item.getBalance(); final String BoxApr = item.getApr(); final String BoxPayment = item.getPayment(); // set up dialog final Dialog dialog = new Dialog(manageDebts.this); dialog.setContentView(R.layout.custom_dialog); dialog.setTitle("Edit Debt Details"); dialog.setCancelable(true); // set up text TextView tv1 = (TextView) dialog.findViewById(R.id.textView1); TextView tv2 = (TextView) dialog.findViewById(R.id.textView2); TextView tv3 = (TextView) dialog.findViewById(R.id.textView3); TextView tv4 = (TextView) dialog.findViewById(R.id.textView4); EditText et1 = (EditText) dialog.findViewById(R.id.editText1); EditText et2 = (EditText) dialog.findViewById(R.id.editText2); EditText et3 = (EditText) dialog.findViewById(R.id.editText3); EditText et4 = (EditText) dialog.findViewById(R.id.editText4); tv1.setText("Debt Description"); tv2.setText("Balance"); tv3.setText("APR"); tv4.setText("Monthly Payment"); et1.setText(BoxName); et2.setText(BoxBalance); et3.setText(BoxApr); et4.setText(BoxPayment); // set up button Button button = (Button) dialog.findViewById(R.id.button1); button.setOnClickListener(new OnClickListener() { public void onClick(View v) { datasource.updateDebt(Long.valueOf(boxId), BoxName, BoxBalance, BoxApr, BoxPayment); dialog.dismiss(); } }); datasource.close(); dialog.show(); } 

和我的数据库类中的更新方法:

 public boolean updateDebt(long updateId, String debtName, String debtTotal, String debtApr, String paymentGoal) { ContentValues values = new ContentValues(); values.put(MySQLiteHelper.COLUMN_DEBT_NAME, debtName); values.put(MySQLiteHelper.COLUMN_DEBT_TOTAL, debtTotal); values.put(MySQLiteHelper.COLUMN_APR, debtApr); values.put(MySQLiteHelper.COLUMN_PAYMENT, paymentGoal); String whereClause = MySQLiteHelper.COLUMN_ID + " = ?"; String[] whereArgs = new String[]{ String.valueOf(updateId) }; return database.update(MySQLiteHelper.TABLE_DEBT, values, whereClause, whereArgs) > 0; } 

有什么build议么?

Solutions Collecting From Web of "Android SQLite空指针exception"

看起来像你试图访问数据库closures时。 也许可以在onCreate的开头放置datasource.open(),在onCreate()的末尾放置datasource.close()并在你的类中调用它们,这样可以解决你的问题。

如果您正在编辑,创build和删除活动中需要多次调用数据库的项目,请考虑在访问数据库的方法的开头调用datasource.open(),然后在该方法的结尾处​​closures()。

最好的是使用SQLiteOpenHelper类,它负责提供SQLiteDatabase的实例,它是单例模式:

请参阅Android:java.lang.IllegalStateException:数据库xxx.db(conn#0)已经closures