Что делать в пользовательском методе fillWindow () ContentProvider?
Я пишу пользовательский ContentProvider, который обслуживает содержимое, состоящее из одной постоянной строки, которую я представляю в виде таблицы из одной строки, имеющей столбцы _id = 0 и value = "SomeString". Эта строка не хранится в базе данных, поэтому я разработал подкласс CrossProcessCursor, который имеет все необходимое для работы, как я описал выше.
Документация для CrossProcessCursor очень скудна и не объясняет, что должен делать метод fillWindow(), кроме очевидного. Основываясь на описании методов CursorWindow, я собрал следующее, которое, как я думал, должно охватить это:
public class MyCursor implements CrossProcessCursor {
...
public void fillWindow(int pos, CursorWindow window) {
if (pos != 0) { // There's only one row.
return;
}
window.clear();
window.allocRow(); // TODO: Error check, false = no memory
window.setNumColumns(2);
window.setStartPosition(0);
window.putLong(0, 0, 0);
window.putString("SomeString", 0, 1);
}
}
Как и ожидалось, он вызывается с pos = 0, когда клиентское приложение запрашивает контент, но клиентское приложение выдает исключение, когда оно пытается перейти после первой (и единственной) строки:
Caused by: java.lang.IllegalStateException: UNKNOWN type 48
at android.database.CursorWindow.getLong_native(Native Method)
at android.database.CursorWindow.getLong(CursorWindow.java:380)
at android.database.AbstractWindowedCursor.getLong(AbstractWindowedCursor.java:108)
at android.database.AbstractCursor.moveToPosition(AbstractCursor.java:194)
at android.database.AbstractCursor.moveToFirst(AbstractCursor.java:248)
at android.database.CursorWrapper.moveToFirst(CursorWrapper.java:86)
...(Snipped)...
Может ли кто-нибудь пролить свет на то, что этот метод должен делать, чтобы вернуть клиенту корректно выглядящую строку?
Благодарю.
1 ответ
Для того, что вы делаете, вы должны проверить MatrixCursor
, Он использует AbstractCursor#fillWindow
реализация, которая вызывает toString
на каждом объекте. Так как вы все равно просто отправляете строку, она должна нормально работать для вас.