2011-04-19 4 views
3

데이터베이스에서 ListView를 채우려 고하고 각 행에 멋진 삭제 단추를 넣으려고합니다. 그래서 Activity 및 사용자 지정 SimpleCursorAdapter 목록을 만들었습니다.사용자 지정 SimpleCursorAdapter, 데이터베이스 쿼리 및 NullPointerException

이것은 메인의 ListView 활동

public class EditEntries extends ListActivity { 
    Cursor cursor; 
    DBAdapter db = new DBAdapter(this); 
    private static String[] FROM = { _ID, SCORE_COLUMN, 
      "date(time, 'localtime')", }; 
    private static int[] TO = { R.id.rowid, R.id.title, R.id.time, }; 

    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.entries_list); 
     try { 
      cursor = getEvents(); 
      showEvents(cursor); 
     } finally { 
      db.close(); 
     } 
    } 

    private void showEvents(Cursor cursor) { 
     // Set up data binding 
     SMSimpleCursorAdapter adapter = new SMSimpleCursorAdapter(this, 
       R.layout.entries_list_item, cursor, FROM, TO); 
     setListAdapter(adapter); 

    } 

    private Cursor getEvents() { 
     db.open(); 
     cursor = db.getAllScores(); 
     startManagingCursor(cursor); 
     return cursor; 
    } 

    void delRow() {  // this is method for deleting row by _id 
     db.open(); 
     db.deleteScore(3); // here will be TAG with _id from adapter, 
     db.close();  // for now I just use hardcoded _id 
    } 

} 

그리고이 있습니다 사용자 정의 SimpleCursorAdapter : 나는 삭제 버튼을 클릭하면

public class SMSimpleCursorAdapter extends SimpleCursorAdapter{ 

    Cursor c; 
    Context context; 
    Activity activity; 

    public SMSimpleCursorAdapter(Context context, int layout, Cursor c, 
      String[] from, int[] to) { 
     super(context, layout, c, from, to); 

     this.c = c; 
     this.context=context; 
     this.activity=(Activity) context; 

    } 
    EditEntries dbDel = new EditEntries(); //from previous code sample 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     if(convertView == null) 
      convertView = View.inflate(context, R.layout.entries_list_item, null); 
     View row = convertView; 

     c.moveToPosition(position); 

     TextView score = (TextView) convertView.findViewById(R.id.title); 
     TextView time = (TextView) convertView.findViewById(R.id.time); 
     TextView id = (TextView) convertView.findViewById(R.id.rowid); 

     id.setText(c.getString(0)); 
     time.setText(c.getString(2)); 
     score.setText(c.getString(1)); 

     String daTag = c.getString(1); 

     ImageButton delButton = (ImageButton) convertView.findViewById(R.id.delButton); 
     delButton.setFocusable(true); 
     delButton.setClickable(true); 
     //delButton.setTag(daTag); 
     delButton.setOnClickListener(new OnClickListener() { //Click listener fro delete button 
      @Override 
      public void onClick(View view) { 
       dbDel.delRow(); //this is "delete row" method from previos code     sample 
      } 
      }); 

     return(row); 
    } 

} 

그리고이 모든 것들은 나에게 NullPointerException이 있습니다. 나는 안드로이드를 처음 접했고, 나는 방금 명백한 것을 놓쳤다 고 가정한다.

로그 캣 :

ERROR/AndroidRuntime (14027) : FATAL EXCEPTION : 메인

ERROR/AndroidRuntime (14027) : java.lang.NullPointerException이

ERROR/AndroidRuntime (14027) : 에서 android.database.sqlite.SQLiteOpenHelper.getWritableDatabase (SQLiteOpenHe : android.content.ContextWrapper.openOrCreateDatabase (ContextWrapper.java:203)

ERROR/AndroidRuntime (14027)에서 lper.java:98)

ERROR/AndroidRuntime (14027)에 namespace.DBAdapter.open (DBAdapter.java:66)

ERROR/AndroidRuntime (14027) namespace.EditEntries.delRow (EditEntries에서. 자바 : 50)

ERROR/AndroidRuntime (14027) : android.view.View.performClick에서 (보기 : namespace.SMSimpleCursorAdapter $ 1.onClick (SMSimpleCursorAdapter.java:64)

ERROR/AndroidRuntime (14027)에서 .java : 2414)

ERROR/AndroidRuntime (14027) : at droid.view.View $ PerformClick.run (View.java:8838)

ERROR/AndroidRuntime (14027) : android.os.Handler.handleCallback (Handler.java:587)

ERROR/AndroidRuntime에서 (14,027) android.os.Handler.dispatchMessage (Handler.java:92)에서

ERROR/AndroidRuntime (14027) android.os.Looper.loop (Looper.java:123)에서

ERROR/AndroidRuntime (14027) : android.app.ActivityThread.main (ActivityThread.java:4680)

ERROR/Andro idRuntime (14027) : java.lang.reflect.Method.invoke (Method.java:521)에서

: java.lang.reflect.Method.invokeNative (기본 방법)

ERROR/AndroidRuntime (14027)에서

ERROR/AndroidRuntime (14027) :에서 com.android.internal.os.ZygoteInit : com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:858)

ERROR/AndroidRuntime (14027)에서 .main (ZygoteInit.java:616)

ERROR/AndroidRuntime (14027) : dalvik.(

EditEntries dbDel = new EditEntries(); //from previous code sample 

당신은 새로운 개체를 만들 수 있지만 관리 활동하지 않습니다 예에서 onCreate 방법 :. system.NativeStart.main (기본 방법)

+2

'logcat' 출력을 게시 할 수 있습니까? –

답변

7

문제는 SMSimpleCursorAdapter 코드에 호출되지 않습니다). NPE는 어댑터에서 두 번째로 만들려고 할 때 DBAdapter에서 가져온 것일 수 있습니다.

빠른 수정 :

EditEntries dbDel; //from previous code sample 
public SMSimpleCursorAdapter(Context context, int layout, Cursor c, 
     String[] from, int[] to) { 
    super(context, layout, c, from, to); 

    this.c = c; 
    this.context = context; 
    this.activity = (Activity) context; 
    this.dbDel = (EditEntries) context; 
} 

방금 ​​빠른 수정을하지 않으려면 훨씬 더 나은 해결책이 될 것입니다 다음에

  1. 이동합니다 delRow, getEvents 방법 당신의 DBAdapter 클래스
  2. (ListActivity에서 생성 된) DBAdapter 클래스에 제공하도록 SMSimpleCursorAdapter의 생성자를 수정하십시오.
+0

예, 의심 스럽지만 로그가 내 이론을 뒷받침했습니다. 희망이 내 대답은 도움이됩니다. – balazsbalazs

+0

고마워, 효과가 있었다. – Sver