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);
}
}