2012-05-21 22 views
15

sto ottenendo questo in LogCat:Android SQLite Null Pointer Exception

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) 

Ecco il codice ad esso associato:

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

E il metodo di aggiornamento della mia classe database:

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

Qualche suggerimento?

+1

dove chiami datasource.open()? – Rymnel

+0

Bene, l'ho appena aggiunto sotto "List values ​​= datasource.getAllDebt();" E ha ottenuto lo stesso errore. (modifica: codice appena aggiornato per mostrare) – KickingLettuce

+0

Dove stai chiamando datasource.open() e datasource.close()? – Rymnel

risposta

16

Sembra che tu stia cercando di accedere al db quando è stato chiuso. Forse collocare datasource.open() all'inizio di onCreate e datasource.close() alla fine di onCreate() e chiamarli ognuno solo una volta nella classe risolverebbe il tuo problema.

Se si modifica, si creano e si eliminano elementi dell'attività che richiedono più chiamate al database, prendere in considerazione la chiamata di datasource.open() all'inizio di un metodo che accede al database e quindi close() alla fine di quel metodo.

+1

Ciò ha funzionato perfettamente. Sembrava anche che chiamassi Apri/Chiudi troppe volte. – KickingLettuce

+0

In che modo è diverso dall'aggiunta della tabella aperta e chiusa all'inizio e alla fine dell'attività ??? –

+0

@BasavarajHampali Anche questa è un'opzione praticabile. Forse aprire su onStart() e chiudere on onusa() funzionerebbe anche. L'idea generale è di aprire e chiudere solo una volta nel corso dell'attività. – Rymnel