CursorAdapter: должен ли я передавать имя столбца в конструкторе?

#android #sqlite #cursor #android-adapter

#Android #sqlite #курсор #android-адаптер

Вопрос:

Я создал подкласс CursorAdapter, который используется для отображения 4 отдельных списков данных в моем приложении.

Каждый список использует другой столбец из базы данных. Мой вопрос в том, как я должен указать адаптеру, какой столбец использовать?

В приведенных ниже кратких примерах 2, которые будут считаться лучшей практикой:

Вариант 1

  • Передайте имя столбца в конструктор моего адаптера.
  • Это означает, что фрагменту необходимо будет знать имя столбца.

 // In my fragment:
DBHelper helper = new DBHelper(getActivity());
Cursor cursor = helper.getTitleCursor();
adapter = new CustomCursorAdapter(getActivity(), cursor, DBHelper.COL_TITLE);


// The constructor of my CursorAdapter:
public CustomCursorAdapter(Context context, Cursor cursor, String colName) {
    super(context, cursor, 0);
    inflater = LayoutInflater.from(context);
    this.displayColumn = colName;
}


// In my cursor adapter:
public void bindView(View view, Context context, Cursor cursor) {
    TextView title = (TextView) view.findViewById(R.id.row_title);

    String titleText = cursor.getString(cursor.getColumnIndex(displayColumn));
    title.setText(titleText);
}
  

Вариант 2

  • При создании курсора используйте AS , чтобы присвоить столбцу определенное имя.
  • Это означает, что фрагменту не нужно знать имя столбца, хотя я не уверен, что это лучшее решение.

_

 // In my DB Helper
public Cursor getTitleCursor() {
    String query = "SELECT title AS displayCol FROM myTable"
    return db.rawQuery(query, null);
}


// In my DB Helper
public Cursor getGenreCursor() {
    String query = "SELECT genre AS displayCol FROM myTable"
    return db.rawQuery(query, null);
}


// In my fragment:
DBHelper helper = new DBHelper(getActivity());
Cursor cursor = helper.getTitleCursor();
adapter = new CustomCursorAdapter(getActivity(), cursor);


// The constructor of my CursorAdapter:
public CustomCursorAdapter(Context context, Cursor cursor) {
    super(context, cursor, 0);
    inflater = LayoutInflater.from(context);
}


// In my cursor adapter
public void bindView(View view, Context context, Cursor cursor) {
    TextView title = (TextView) view.findViewById(R.id.row_title);

    String titleText = cursor.getString(cursor.getColumnIndex("displayCol"));
    title.setText(titleText);
}
  

Комментарии:

1. Для платформы Android требуется столбец с именем _id для некоторых курсоров. Но что именно вы имеете в виду под «лучше»?

2. @CL Это именно то, что заставило меня усомниться в этом — класс CursorAdapter (т. Е. родительский класс) требует, чтобы вы передавали столбец с именем _id . Под «лучше» я имею в виду, есть ли какая-либо очевидная причина использовать один вариант поверх другого?