Что делать в пользовательском методе 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 на каждом объекте. Так как вы все равно просто отправляете строку, она должна нормально работать для вас.

Другие вопросы по тегам