Использование 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 ответа

Решение

Попробуйте построить имя таблицы в виде поля в двух SELECTs.

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);
Другие вопросы по тегам