Ответ 1
Нет необходимости "разворачивать" курсор. Проблема в том, что если поставщик контента предоставляет результаты клиенту, который запускается в другом процессе, курсор, который вы вернули из 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;
}
}