2011-08-11 26 views
2

このリストビューに関して何をしようとしていても、ボタンを押すたびに動的に更新されるようにしていて、常にNPEをスローします。リストビューをデータベースからリフレッシュすることができません

コードは以下のとおりです。私は本当に援助を歓迎します。私は再クエリーを試みましたが、notifyDataSetChangedを試しましたが、正直なところ、これは私の2番目のプロジェクトであり、データベースまたはリストビューを使用している第1のプロジェクトであり、苦労します。

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

はこれを試して、私はあなたが.setListAdapter()を行う必要がいけないのアダプタを設定したら、それはとても

+0

私はそれが同じエラーであるのを助けなかったのではないかと心配しています。 Logcatはまだladapter.notifyDataSetChanged()を表示しています。問題の原因となっている行と同じです。 –

+0

ok、今私は1行を削除しました –

+0

それは私が恐れているのと同じです。 BaseAdapter()を拡張したクラスを使って、他のコード例を見てきました。それは私が活動の先頭ページ以外に必要なものなのでしょうか?これは私がプロジェクトで持っている唯一の2つのクラスですか? –

0

が起こっている理由を、あなたのコンテキストがnullのthatsだと思います。アダプターをクラス内のグローバル変数として宣言してください(最初と同じように)、アダプター・データが変更された時点でadapter.notifyDataSetChanged()を呼び出してください。問題が解決しない場合は、アダプタを再起動してからnotifyDataSetChanged()を呼び出してみてください。

アダプターのタイプ定義を削除しようとしたときに、すでにpublic SimpleCursorAdapter ladapter;に試しにデータを入力するだけでした。

関連する問題