2012-05-21 64 views
15

我得到這個在logcat中:的Android SQLite的空指針異常

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; 
} 

有什麼建議嗎?

+1

你在哪裏調用datasource.open()? – Rymnel

+0

那麼,我只是將它添加到「列表 values = datasource.getAllDebt();」並得到同樣的錯誤。 (編輯:剛更新的代碼顯示) – KickingLettuce

+0

你在哪裏調用datasource.open()和datasource.close()? – Rymnel

回答

16

看起來像試圖在數據庫關閉時訪問數據庫。也許可以在onCreate的開頭放置datasource.open(),在onCreate()的末尾放置datasource.close()並在你的類中每次調用它們都可以解決你的問題。

如果您正在編輯,創建和刪除活動中需要多次調用數據庫的項目,請考慮在訪問數據庫的方法的開頭調用datasource.open(),然後在訪問數據庫的方法的開頭調用datasource.open()該方法。

+1

完美運作。它看起來好像我打電話過多次。 – KickingLettuce

+0

與在活動開始和結束時添加打開和關閉表格有何不同? –

+0

@BasavarajHampali這也是一個可行的選擇。也許在onStart()上打開並關閉onPause()也可以。總的想法是在活動過程中只打開和關閉一次。 – Rymnel