Что делать в пользовательском методе fillWindow () ContentProvider? - PullRequest
2 голосов
/ 27 июля 2010

Я пишу пользовательский ContentProvider, который обслуживает контент, состоящий из одной постоянной строки, которую я представляю в виде таблицы из одной строки, имеющей столбцы _id = 0 и value = "SomeString".Эта строка не хранится в базе данных, поэтому я разработал подкласс 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 Ответ

1 голос
/ 27 июля 2010

Для того, что вы делаете, вы должны проверить MatrixCursor.Он использует реализацию AbstractCursor#fillWindow, которая вызывает toString для каждого объекта.Так как вы все равно отправляете строку, она должна нормально работать для вас.

...