Нет необходимости «разворачивать» курсор. Проблема заключается в том, что если ваш поставщик контента предоставляет результаты клиенту, работающему в другом процессе, курсор, возвращенный функцией query (), должен реализовывать интерфейс CrossProcessCursor. Это не указано в документе (AFAICS), но вы можете увидеть это в своем журнале.
Все, что вам нужно сделать, это реализовать интерфейс CrossProcessCursor и обернуть его вокруг курсора.
// your query statement does not seem right..BTW
Cursor result = mContentResolver.query(...);
// now, you return a CrossProcessCursorWrapper.
return new CrossProcessCursorWrapper(result);
Реализация методов CrossProcessCursor перенесена из AbstractCursor. Некоторые небольшие изменения сделаны так, чтобы компилятор был доволен:
public class CrossProcessCursorWrapper extends CursorWrapper implements
CrossProcessCursor {
public CrossProcessCursorWrapper(Cursor cursor) {
super(cursor);
}
@Override
public CursorWindow getWindow() {
return null;
}
@Override
public void fillWindow(int position, CursorWindow window) {
if (position < 0 || position > getCount()) {
return;
}
window.acquireReference();
try {
moveToPosition(position - 1);
window.clear();
window.setStartPosition(position);
int columnNum = getColumnCount();
window.setNumColumns(columnNum);
while (moveToNext() && window.allocRow()) {
for (int i = 0; i < columnNum; i++) {
String field = getString(i);
if (field != null) {
if (!window.putString(field, getPosition(), i)) {
window.freeLastRow();
break;
}
} else {
if (!window.putNull(getPosition(), i)) {
window.freeLastRow();
break;
}
}
}
}
} catch (IllegalStateException e) {
// simply ignore it
} finally {
window.releaseReference();
}
}
@Override
public boolean onMove(int oldPosition, int newPosition) {
return true;
}
}