2011-08-11 36 views
2

不管我對這個listview試圖做什麼,並試圖讓它在每次點擊按鈕時動態更新它都不起作用,並且總是拋出一個NPE。無法讓Listview從數據庫中刷新

代碼如下,我非常歡迎提供幫助。我試過重新查詢,我試過了notifyDataSetChanged,但我會說實話,這只是我的第二個項目,第一個使用數據庫或列表視圖,我會努力。

DatabaseHelper

import android.content.Context; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteOpenHelper; 
import android.provider.BaseColumns; 
import android.util.Log; 

public class DatabaseHelper extends SQLiteOpenHelper { 

private static final String TAG = DatabaseHelper.class.getSimpleName(); 

public static final String DATABASE_NAME = "reordermymeds.db"; 
public static final int DATABASE_VERSION = 3; 
public static final String TABLE_NAME = "Medicines"; 
public static final String C_ID = BaseColumns._ID; 
public static final String C_MED_NAME = "med_name"; 
public static final String TABLE_NAME_SURG = "Surgeries"; 
public static final String SURGERY_NAME = "sName"; 
public static final String SURGERY_TEL = "sTel"; 
public static final String SURGERY_MAIL = "sMail"; 



public DatabaseHelper(Context context) { 
    super(context, DATABASE_NAME, null, DATABASE_VERSION); 
    // TODO Auto-generated constructor stub 
} 

@Override 
public void onCreate(SQLiteDatabase db) { 
    // TODO Auto-generated method stub 
    String sql = String.format("CREATE TABLE %s (%s INTEGER PRIMARY KEY, %s  TEXT)", TABLE_NAME, C_ID, C_MED_NAME); 
    String sql_surg = String.format(
      "create table %s (%s int primary key, %s TEXT, %s TEXT, %s TEXT)", 
      TABLE_NAME_SURG, C_ID, SURGERY_NAME, SURGERY_TEL, SURGERY_MAIL); 

    Log.d(TAG, "onCreate sql: "+sql); 

    db.execSQL(sql); 
    db.execSQL(sql_surg); 



} 

@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
    // TODO Auto-generated method stub 
    db.execSQL("drop table if exists " + TABLE_NAME); 
    db.execSQL("drop table if exists " + TABLE_NAME_SURG); 
    this.onCreate(db); 
} 

} 

活動

import android.app.ListActivity; 
import android.content.ContentValues; 
import android.content.Context; 
import android.database.Cursor; 
import android.database.sqlite.SQLiteDatabase; 
import android.os.Bundle; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.SimpleCursorAdapter; 
import android.widget.Toast; 



public class pills extends ListActivity { 

public static final String C_MED_NAME = "med_name"; 
public SimpleCursorAdapter ladapter; 

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.pills); 

    try { 

      DatabaseHelper DBHelper= new DatabaseHelper(this); 
      SQLiteDatabase db = DBHelper.getReadableDatabase(); 


      Cursor cur = db.query("Medicines", null, null, null, null, null, null); 
      startManagingCursor(cur); 

      String [] columns = new String[] {C_MED_NAME}; 
      int [] to = new int[] {R.id.meditem}; 

      SimpleCursorAdapter ladapter = new SimpleCursorAdapter(this, R.layout.meditem, cur, columns, to); 

      this.setListAdapter(ladapter); 
    } catch (Exception e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 



    Button saveMed = (Button) findViewById(R.id.pills_newmedsubmit); 
    saveMed.setOnClickListener(new OnClickListener() { 



     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 

      final EditText newMed = (EditText) findViewById(R.id.pills_newmedtxtbox); 

      if (newMed.getText().toString().equals("")) { 

        Context context = getApplicationContext(); 
        CharSequence text = "Please type the name of a new prescription item."; 
        int duration = Toast.LENGTH_SHORT; 

        Toast toast= Toast.makeText(context, text, duration); 
        toast.show(); 
      } 
      else 
      { 

        String medName = newMed.getText().toString(); 

        insertNewPrescriptionItem(medName); 

        EditText clearTextBox = (EditText) findViewById(R.id.pills_newmedtxtbox); 
        clearTextBox.setText(""); 

        Context context = getApplicationContext(); 
        CharSequence text = "Saved"; 
        int duration = Toast.LENGTH_SHORT; 

        Toast toast = Toast.makeText(context, text, duration); 
        toast.show(); 


      } 

     setListAdapter(ladapter); 
     ladapter.notifyDataSetChanged(); 

     } 


    });} 

    private void insertNewPrescriptionItem (String medName){ 

     DatabaseHelper DbHelper = new DatabaseHelper(this); 

     SQLiteDatabase db = DbHelper.getWritableDatabase(); 

     ContentValues cv = new ContentValues(); 

      cv.put(DatabaseHelper.C_MED_NAME, medName); 

      db.insert(DatabaseHelper.TABLE_NAME, DatabaseHelper.C_MED_NAME, cv); 
      db.close(); 
      } 


} 

當然,最後但並非最不重要的,堆棧跟蹤。我可以看到該錯誤,但我嘗試使用Google的每一個結果都是一樣的。任何人都可以證明我是否一定會出現愚蠢的錯誤?

堆棧跟蹤

08-11 01:21:26.095: ERROR/AndroidRuntime(15327): FATAL EXCEPTION: main 
08-11 01:21:26.095: ERROR/AndroidRuntime(15327): java.lang.NullPointerException 
08-11 01:21:26.095: ERROR/AndroidRuntime(15327):  at com.asurya.reordmymeds.pills$1.onClick(pills.java:90) 
08-11 01:21:26.095: ERROR/AndroidRuntime(15327):  at android.view.View.performClick(View.java:2485) 
08-11 01:21:26.095: ERROR/AndroidRuntime(15327):  at android.view.View$PerformClick.run(View.java:9080) 
08-11 01:21:26.095: ERROR/AndroidRuntime(15327):  at android.os.Handler.handleCallback(Handler.java:587) 
08-11 01:21:26.095: ERROR/AndroidRuntime(15327):  at android.os.Handler.dispatchMessage(Handler.java:92) 
08-11 01:21:26.095: ERROR/AndroidRuntime(15327):  at android.os.Looper.loop(Looper.java:130) 
08-11 01:21:26.095: ERROR/AndroidRuntime(15327):  at android.app.ActivityThread.main(ActivityThread.java:3683) 
08-11 01:21:26.095: ERROR/AndroidRuntime(15327):  at java.lang.reflect.Method.invokeNative(Native Method) 
08-11 01:21:26.095: ERROR/AndroidRuntime(15327):  at java.lang.reflect.Method.invoke(Method.java:507) 
08-11 01:21:26.095: ERROR/AndroidRuntime(15327):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
08-11 01:21:26.095: ERROR/AndroidRuntime(15327):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
08-11 01:21:26.095: ERROR/AndroidRuntime(15327):  at dalvik.system.NativeStart.main(Native Method) 
08-11 01:21:26.107: WARN/ActivityManager(110): Force finishing activity com.asurya.reordmymeds/.pills 

哎呀。如果我讓大家都知道這會幫助,與其指望他們自己:)

的代碼這是造成NPE是行:

ladapter.notifyDataSetChanged(); 

另外,如果我只是註釋掉該行,該應用程序運行正常,但您必須刷新活動以查看數據庫中的更新數據。謝謝大家。

+0

哪條線是'90'? –

+0

糟糕。如果我讓你們都知道,而不是自己計算它們,它會有所幫助:)導致NPE的代碼行是ladapter.notifyDataSetChanged();另外,如果我只是註釋掉這一行,應用程序運行良好,但您必須刷新活動以查看數據庫中的更新數據。謝謝大家。 –

回答

1
import android.app.ListActivity; 
    import android.content.ContentValues; 
    import android.content.Context; 
    import android.database.Cursor; 
    import android.database.sqlite.SQLiteDatabase; 
    import android.os.Bundle; 
    import android.view.View; 
    import android.view.View.OnClickListener; 
    import android.widget.Button; 
    import android.widget.EditText; 
    import android.widget.SimpleCursorAdapter; 
    import android.widget.Toast; 

    public class pills extends ListActivity { 

    public static final String C_MED_NAME = "med_name"; 
    public SimpleCursorAdapter ladapter; 
    Context context; 
    Cursor cur; 

    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.pills); 
     context=this; 
     try { 

       DatabaseHelper DBHelper= new DatabaseHelper(this); 
       SQLiteDatabase db = DBHelper.getReadableDatabase(); 


       cur = db.query("Medicines", null, null, null, null, null, null); 
       startManagingCursor(cur); 

       String [] columns = new String[] {C_MED_NAME}; 
       int [] to = new int[] {R.id.meditem}; 

       ladapter = new SimpleCursorAdapter(this, R.layout.meditem, cur, columns, to); 

       this.setListAdapter(ladapter); 
     } catch (Exception e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 



     Button saveMed = (Button) findViewById(R.id.pills_newmedsubmit); 
     saveMed.setOnClickListener(new OnClickListener() { 



      @Override 
      public void onClick(View v) { 
       // TODO Auto-generated method stub 

       final EditText newMed = (EditText) findViewById(R.id.pills_newmedtxtbox); 

       if (newMed.getText().toString().equals("")) { 

    //     Context context = getApplicationContext(); 
         CharSequence text = "Please type the name of a new prescription item."; 
         int duration = Toast.LENGTH_SHORT; 

         Toast toast= Toast.makeText(context, text, duration); 
         toast.show(); 
       } 
       else 
       { 

         String medName = newMed.getText().toString(); 

         insertNewPrescriptionItem(medName); 

         EditText clearTextBox = (EditText) findViewById(R.id.pills_newmedtxtbox); 
         clearTextBox.setText(""); 

    //     Context context = getApplicationContext(); 
         CharSequence text = "Saved"; 
         int duration = Toast.LENGTH_SHORT; 

         Toast toast = Toast.makeText(context, text, duration); 
         toast.show(); 


       } 

      refresh(); 

      } 


     });} 

     private void insertNewPrescriptionItem (String medName){ 

      DatabaseHelper DbHelper = new DatabaseHelper(this); 

      SQLiteDatabase db = DbHelper.getWritableDatabase(); 

      ContentValues cv = new ContentValues(); 

       cv.put(DatabaseHelper.C_MED_NAME, medName); 

       db.insert(DatabaseHelper.TABLE_NAME, DatabaseHelper.C_MED_NAME, cv); 
       db.close(); 
       } 


    } 
public void refresh(){ 
cur = db.query("Medicines", null, null, null, null, null, null); 
ladapter.notifyDataSetChanged(); 
} 

試試這個,我覺得你的背景是空這就是爲什麼它正在發生這樣

+0

恐怕沒有幫助,這是一樣的錯誤。 Logcat仍然顯示ladapter.notifyDataSetChanged();作爲導致問題的線路。 –

+0

好吧,現在我已經刪除了1行 –

+0

它仍然是我害怕的一樣。我見過其他代碼示例,使用擴展BaseAdapter()的類。除了活動的首頁之外,我還需要這些東西,這是我在項目中唯一的兩個類別嗎? –

0

一旦你設置你不適配器需要做.setListAdapter()。在您的類中聲明適配器爲全局變量(就像您在開始時所做的那樣),然後在適配器數據發生更改的位置調用adapter.notifyDataSetChanged()。如果它不起作用,請嘗試重新啓用適配器,然後調用notifyDataSetChanged()

在嘗試刪除適配器的類型定義,你已經做了public SimpleCursorAdapter ladapter;只是嘗試與try中的數據。