2012-05-21 12 views
15

Me estoy haciendo esto en LogCat:Android SQLite Excepción de puntero nulo

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) 

Este es el código asociado a él:

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

y el método de actualización en mi clase de base de datos:

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

¿Alguna sugerencia?

+1

¿De dónde llama datasource.open()? – Rymnel

+0

Bueno, acabo de agregarlo debajo de "List values ​​= datasource.getAllDebt();" Y obtuve el mismo error. (edite: acaba de actualizar el código para mostrar) – KickingLettuce

+0

¿A dónde llama a datasource.open() y datasource.close()? – Rymnel

Respuesta

16

Parece que está intentando acceder a la base de datos cuando se ha cerrado. Tal vez colocar datasource.open() al inicio de onCreate y datasource.close() al final de onCreate() y llamarlos a cada uno una sola vez en su clase resolvería su problema.

Si está editando, creando y eliminando elementos en su actividad que requieren múltiples llamadas a su base de datos, considere llamar a datasource.open() al comienzo de un método que acceda a la base de datos y luego close() al final de ese método.

+1

Eso funcionó perfectamente. También parecía que llamaba Abrir/Cerrar demasiadas veces. – KickingLettuce

+0

¿En qué se diferencia de agregar abrir y cerrar tabla al inicio y al final de la actividad? –

+0

@BasavarajHampali Esa es también una opción viable. Tal vez abrir en onStart() y cerrar en onPause() también funcionaría. La idea general es abrir y cerrar solo una vez en el transcurso de la actividad. – Rymnel

Cuestiones relacionadas