Android: добавить столбец в уже заполненный курсор

Я не понимаю, использовать ли MergeCursor или CursorJoiner.

У меня есть курсор (A) с загрузкой данных в нем. Допустим, в Cursor (A) есть 100 строк и 3 столбца. Что я хочу сделать, это вставить (добавить) новый столбец в курсор, чтобы результирующий курсор (B) имел 100 строк, но 4 столбца.

В данный момент я хотел бы, чтобы 4-й столбец содержал значение по умолчанию для 100 строк.

Как бы я это сделал?

0 ответов

Вы можете использовать здесь шаблон Decorator.

Для этого в Android есть CursorWrapper, который...

Класс-оболочка для Cursor, который делегирует все вызовы фактическому объекту курсора. Основное использование этого класса - расширение курсора при замене только подмножества его методов.

Предположим, ваш новый столбец называется newColumn, и что это типа String тогда вы можете сделать что-то в этом роде:

class MyCursorWrapper extends CursorWrapper {
    private final String NEW_COLUMN = "newColumn";

    @Override
    public int getColumnCount() {
        // Count the virtual column in
        return getWrappedCursor().getColumnCount() + 1;
    }

    @Override
    public int getColumnIndex(String columnName) {
        // Return the virtual column if they are asking for it,
        // otherwise just use the original 
        if (columnName != null && columnName.equals("newColumn") {
            return getWrappedCursor().getColumnCount();
        }
        return mCursor.getColumnIndex(columnName);
    }

    public int getColumnIndexOrThrow(String columnName)
            throws IllegalArgumentException {
        // Same logic as getColumnIndex()
        if (columnName != null && columnName.equals(NEW_COLUMN) {
            return getWrappedCursor().getColumnCount();
        }
        return getWrappedCursor.getColumnIndexOrThrow(columnName);
    }

    @Override
    public String getColumnName(int columnIndex) {
         if (columnIndex == getWrappedCursor.getColumnCount()) {
             return NEW_COLUMN;
         }
         return getWrappedCursor().getColumnName(columnIndex);
    }

    @Override
    public String[] getColumnNames() {
        // Add our virtual column to the result from the original Cursor
        String original = getWrappedCursor().getColumnNames()
        String result = new String[original.length + 1];
        System.arrayCopy(original, 0, result, 0, original.length);
        result[original.length] = NEW_COLUMN;
        return result;
    }

    @Override
    public String getString(int columnIndex) {
        // For the last column, return whatever you need to return here
        // For real columns, just delegate to the original Cursor
        if (columnIndex == getWrappedCursor().getColumnCount()) {
            return yourResultHere();
        }
        return getWrappedCursor().getString(columnIndex);
    }
}
Другие вопросы по тегам