2012-05-21 10 views
15

Ich erhalte diese in LogCat:Android SQLite Null-Zeiger-Ausnahme

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) 

Hier ist der Code ist damit verbunden:

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

Und die Update-Methode in meiner Datenbank Klasse:

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

Irgendwelche Vorschläge?

+1

sehen, wo Sie anrufen datasource.open()? – Rymnel

+0

Nun, ich habe es gerade unter "Liste values ​​= datasource.getAllDebt();" Und habe denselben Fehler bekommen. (bearbeiten: nur aktualisierten Code zu zeigen) – KickingLettuce

+0

Wo rufen Sie datasource.open() und datasource.close()? – Rymnel

Antwort

16

Sieht so aus, als ob Sie versuchen, auf die Datenbank zuzugreifen, wenn sie geschlossen wurde. Wenn Sie am Anfang von onCreate und data source.close() am Ende von onCreate() datasource.open() platzieren und sie jeweils nur einmal in Ihrer Klasse aufrufen, würde das Ihr Problem lösen.

Wenn Sie Elemente in Ihrer Aktivität bearbeiten, erstellen und löschen, die mehrere Aufrufe an Ihre Datenbank erfordern, sollten Sie datenquellen.open() am Anfang einer Methode aufrufen, die auf die Datenbank zugreift, und dann schließen() am Ende von diese Methode.

+1

Das hat perfekt funktioniert. Es sah auch so aus, als würde ich Open/Close zu oft anrufen. – KickingLettuce

+0

Wie unterscheidet sich das Hinzufügen von Öffnen und Schließen Tabelle am Anfang und Ende der Aktivität ??? –

+0

@BasavarajHampali Das ist auch eine praktikable Option. Vielleicht würde auch das Öffnen von onStart() und das Schließen von onPause() funktionieren. Die allgemeine Idee ist, nur einmal im Verlauf der Aktivität zu öffnen und zu schließen. – Rymnel