Использование cursor.respond(Bundle) & cursor.getextras()
У меня есть 2 курсора из разных таблиц в базе данных SQLite. Я пытаюсь поместить данные из двух курсоров в один ListView
но для различного форматирования данных от каждого курсора.
Что я думал об использовании MergeCursor
объединить оба курсора, но ViewBinder
для меня SimpleCursorAdapter
будет видеть их как один курсор и не сможет различить форматирование (если я не изменю свои таблицы, чего я не хочу делать).
Наконец, я нашел 2 метода под названием Cursor.repond(Bundle)
& Cursor.getExtras()
, но документация на консоли разработчика очень короткая, и поиск в Google этих методов не прояснил их использование.
Я проверил мою идею использовать resond()
в моем классе базы данных для запроса:
extr.putString("table", the_tab);
Cursor c_in = db.rawQuery(qry, null);
c_in.respond(extr);
return c_in;
И использовать getExtras()
в ViewBinder
знать таблицу запроса и отформатировать ListView
пункт соответственно:
Bundle extr=cur.getExtras();
String tab= extr.getString("table");
Но я всегда получаю исключение, что tab
является null
,
Мой вопрос после этого длинного описания: я использую respond
а также getExtras
методы правильно? И если нет, то есть ли лучший подход к моей проблеме?
4 ответа
Попробуйте построить имя таблицы в виде поля в двух SELECT
s.
SELECT "A", * from tableA; SELECT "B", * from tableB;
затем вычислить объединенный курсор. С другой стороны,
SELECT "A", * from tableA UNION ALL SELECT "B", * from tableB;
Теперь каждая строка курсора будет иметь "A"
в первом столбце, если он пришел tableA
и "B"
если он пришел tableB
, Так что легко посмотреть на этот столбец в вашем ViewBinder
принимать решения о форматировании.
Если вы хотите использовать Bundle
в getExtras
Кажется, что AbstractCursor
который продлен AbstractWindowedCursor
который продлен SQLiteCursor
определяет setExtras
метод. Это документация читает
Устанавливает android.os.Bundle, который будет возвращен getExtras(). null будет конвертирован в android.os.Bundle.EMPTY.
respond
используется для внеполосной связи с Cursor
согласно документации.
Итак, ответ:
((AbstractCursor) cursor).setExtras(bundle);
Тогда вы сможете позвонить
cursor.getExtras();
позже, чтобы получить это Bundle
,
РЕДАКТИРОВАТЬ:
Посмотрев дальше, кажется, что setExtras
по какой-то причине помечен как скрытый, поэтому он является общедоступным и предназначен для использования, как описано (и желательно) Смотрите пример ContactsProvider2
Итак, я придумал с помощью CursorWrapper
и переопределяя getExtras
там, чтобы обеспечить Bundle
, В моем случае я создаю Bundle
в CursorWrapper
, поэтому мне не нужен метод для его установки.
@Override
public Bundle getExtras() {
return _meta_data;
}
Я бы настаивал на том, чтобы вы посмотрели на MergeCursor
а также AbstractCursor
чтобы обойти вашу проблему и получить решение. Например, вы можете проверить this
ответ.
Вот альтернатива (хотя вы не должны ее использовать):
Class.forName("android.database.AbstractCursor")
.getMethod("setExtras", new Class[]{Bundle.class})
.invoke(c_in, extr);