Наткнулся на это в поисках другого решения, но просто хочу добавить это, так как я считаю, что ответы неудовлетворительны.
Вы можете легко создать свой собственный класс курсора. Чтобы позволить функциям, требующим, чтобы Cursor принимал его, он должен расширять AbstractCursor. Чтобы преодолеть проблему, когда система не использует ваш класс, вы просто делаете свой класс оберткой.
Здесь действительно хороший пример.
https://android.googlesource.com/platform/packages/apps/Contacts/+/8df53636fe956713cc3c13d9051aeb1982074286/src/com/android/contacts/calllog/ExtendedCursor.java
public class ExtendedCursor extends AbstractCursor {
/** The cursor to wrap. */
private final Cursor mCursor;
/** The name of the additional column. */
private final String mColumnName;
/** The value to be assigned to the additional column. */
private final Object mValue;
/**
* Creates a new cursor which extends the given cursor by adding a column with a constant value.
*
* @param cursor the cursor to extend
* @param columnName the name of the additional column
* @param value the value to be assigned to the additional column
*/
public ExtendedCursor(Cursor cursor, String columnName, Object value) {
mCursor = cursor;
mColumnName = columnName;
mValue = value;
}
@Override
public int getCount() {
return mCursor.getCount();
}
@Override
public String[] getColumnNames() {
String[] columnNames = mCursor.getColumnNames();
int length = columnNames.length;
String[] extendedColumnNames = new String[length + 1];
System.arraycopy(columnNames, 0, extendedColumnNames, 0, length);
extendedColumnNames[length] = mColumnName;
return extendedColumnNames;
}
Это общее представление о том, как это будет работать.
Теперь к сути проблемы. Чтобы предотвратить снижение производительности, создайте хэш для хранения индексов столбцов. Это будет служить кешем. Когда вызывается getString, проверьте хеш для индекса столбца. Если он не существует, извлеките его с помощью getColumnIndex и кэшируйте его.
Извините, я не могу добавить какой-либо код в настоящее время, но я нахожусь на мобильном телефоне, поэтому я постараюсь добавить его позже.