2017-04-30 12 views
0

私のプログラムの目的は、SQLiteデータベースにデータを格納し、そのデータベースをリストビューで使用することです。 私は以下のコードを提供しました(いくつかの不要なコードを削除しました)。 ダミーデータをデータベースに正常に挿入しました。 カスタムアダプターのレイアウトも正しく機能しています。 Timetableのオブジェクトを作成するときに私のアプリがクラッシュしました。 私はできることをすべて試みましたが、うまくいきませんでした。カスタムカーソルアダプタが機能しないのはなぜですか? ArrayAdapterと一緒に使用すると、同じコードが正常に動作していました

さらに詳しい情報が必要な場合はお知らせください。コードは以下によってMainActivity.java

TimeTableDBHelper timeTableDbHelper = new TimeTableDBHelper(this); 
    SQLiteDatabase db = timeTableDbHelper.getWritableDatabase(); 
    db = timeTableDbHelper.getReadableDatabase(); 
    String[] columns = {TimeTableContract.COLUMN_NAME_START_TIME,TimeTableContract.COLUMN_NAME_END_TIME, 
          TimeTableContract.COLUMN_NAME_DATE, 
          TimeTableContract.COLUMN_NAME_MONTH 
          }; 

    Cursor cursor = db.query(TimeTableContract.TABLE_NAME, columns, null, null, null, null, null); 
//My app is crashing after this line only 
    TimeTableAdapter adapter = new TimeTableAdapter(this, cursor); 
    ListView listView = (ListView) findViewById(R.id.mainListView1); 
    listView.setAdapter(adapter); 
cursor.close(); 

TimetableAdapter.java

public class TimeTableAdapter extends CursorAdapter 
{ 

public TimeTableAdapter(Context context, Cursor cursor) 
{ 
    super(context,cursor,0); 
} 

@Override 
public View newView(Context context, Cursor cursor, ViewGroup parent) 
{ 

    return LayoutInflater.from(context).inflate(R.layout.table_list_view, parent, false); 
} 

@Override 
public void bindView(View view, Context context, Cursor cursor) 
{ 
int startColumnIndex = cursor.getColumnIndex(TimeTableContract.COLUMN_NAME_START_TIME); 
    String time1 = cursor.getString(startColumnIndex); 
    int endColumnIndex = cursor.getColumnIndex(TimeTableContract.COLUMN_NAME_END_TIME); 
    String time2 = cursor.getString(endColumnIndex); 
    int dateColumnIndex = cursor.getColumnIndex(TimeTableContract.COLUMN_NAME_DATE); 
    String date = cursor.getString(dateColumnIndex); 
    int monthColumnIndex = cursor.getColumnIndex(TimeTableContract.COLUMN_NAME_MONTH); 
    String month = cursor.getString(monthColumnIndex); 

    TextView startTime = (TextView) view.findViewById(R.id.start_time); 
    TextView endTime = (TextView) view.findViewById(R.id.end_time); 
    TextView tuitorName = (TextView) view.findViewById(R.id.tuitor_name); 
    TextView subject = (TextView) view.findViewById(R.id.subject); 
    TextView remarks = (TextView) view.findViewById(R.id.remarks); 
    TextView dateMonth = (TextView) view.findViewById(R.id.date); 

    startTime.setText(time1); 
    endTime.setText(time2); 
    tuitorName.setText("Tutor"); 
    subject.setText("subject"); 
    remarks.setText("remarks..."); 
    dateMonth.setText(date+", " + month); 
} 

契約クラス

データベース内のテーブルを作成
public class TimeTableContract 
{ 
// Make constructor private do that it does not initiatted accidently 
private TimeTableContract() 
{}; 
public static final String TABLE_NAME = "time_table"; 
public static final String COLUMN_NAME_START_TIME = "start_time"; 
public static final String COLUMN_NAME_END_TIME = "end_time"; 
public static final String COLUMN_NAME_DATE = "date"; 
public static final String COLUMN_NAME_MONTH = "month"; 
public static final String COLUMN_NAME_ID = "_id"; 

} 

(方法によって問題がありません私のデータベースヘルパークラス)

"CREATE TABLE " + TimeTableContract.TABLE_NAME + " (" + 
        TimeTableContract.COLUMN_NAME_ID + " INTEGER PRIMARY KEY," + 
        TimeTableContract.COLUMN_NAME_START_TIME + " TEXT," + 
        TimeTableContract.COLUMN_NAME_END_TIME + " TEXT,"+ 
        TimeTableContract.COLUMN_NAME_DATE + " TEXT,"+ 
        TimeTableContract.COLUMN_NAME_MONTH + " TEXT)"; 
+0

名前付き引数と同じ_idを取得します。 –

+0

何でも。しかし、後ほど簡単なカーソル・アダプタからカーソル・アダプタへコードを移植することで、問題に陥ることはありません。 –

+0

私のコードに問題があります。 –

答えて

0

あなたはここにあなたのカーソルに「_id」の列が欠落しています

​​

それはあなたが他のCursorAdaptersとリストビューまたはで作業している場合は、あなたのカーソルで「_id」の列を含める必要がありますアンドロイド大会です彼らは動作しません。あなたがonItemClickあなたのリストビューのための()メソッドを実装する場合

は、私は、アダプタをより細かく制御を望んでいるので long id

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, **long id**) 
+0

ありがとう@kush gupt、今、私のアプリは動作していますが、私はcursor.close()ステートメント(ActivityMain.java>最後の行)を削除する必要があります。次に、この声明をどこに置くべきですか? –

+0

@vivekkumarカーソルとデータベースは、リソースを解放するために終了した後に閉じる必要があります。私たちは通常、終了したらすぐに閉じますが、アダプターの場合は少し異なります。カーソル・アダプターは、より多くのデータが必要になるまで、カーソルを開いたままにする必要があります。条件を考えてみましょう。アダプタをリストビューに設定してすぐにカーソルを閉じると、listviewは最初の20個のビューにデータを入力できるようになりました。ユーザは下にスクロールし、リストビューはカーソルからデータを探します死んでいる。 –

+0

私は議論していませんが、カスタムアダプターを呼び出すときにカーソルをすでに渡していれば、そのアダプターが元のカーソルに依存している理由を知りたいと思います。 –

関連する問題