2012-05-21 14 views
15

मैं LogCat में यह हो रही है:एंड्रॉयड SQLite नल पॉइंटर एक्सेप्शन

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

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) 

यहाँ इसके साथ जुड़े कोड है

कोई सुझाव?

+1

देखना तुम कहाँ datasource.open बुला रहे हैं()? – Rymnel

+0

ठीक है, मैंने अभी इसे नीचे सूचीबद्ध किया है "सूची मान = datasource.getAllDebt();" और एक ही त्रुटि मिली। (संपादित करें: दिखाने के लिए बस अद्यतन कोड) – KickingLettuce

+0

आप datasource.open() और datasource.close() कहां कॉल कर रहे हैं? – Rymnel

उत्तर

16

ऐसा लगता है कि यह बंद होने पर डीबी तक पहुंचने की कोशिश कर रहा है। शायद onrere() के अंत में create और datasource.close() की शुरुआत में datasource.open() को रखकर और उन्हें कॉल करने से प्रत्येक को आपकी कक्षा में एक बार आपकी समस्या हल हो जाएगी।

यदि आप अपनी गतिविधि में आइटम को संपादित, निर्माण और हटा रहे हैं, तो आपके डेटाबेस में एकाधिक कॉल की आवश्यकता है, डेटाबेस की एक्सेस करने वाली विधि की शुरुआत में datasource.open() को कॉल करने पर विचार करें और फिर अंत में() बंद करें वह विधि

+1

यह पूरी तरह से काम किया। ऐसा लगता है कि मैं कई बार ओपन/बंद कर रहा था। – KickingLettuce

+0

गतिविधि की शुरुआत और अंत में खुली और बंद तालिका जोड़ने से यह अलग कैसे है ??? –

+0

@ बासवराजंपली यह भी एक व्यवहार्य विकल्प है। शायद ऑनस्टार्ट() पर खुलना और ऑन पॉज़() पर बंद करना भी काम करेगा। सामान्य विचार गतिविधि के दौरान केवल एक बार खोलना और बंद करना है। – Rymnel

संबंधित मुद्दे