2

我正在编写一个自定义 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)...

任何人都可以阐明这个方法应该做什么来向客户端返回一个看起来正确的行吗?

谢谢。

4

1 回答 1

1

对于您正在做的事情,您应该查看MatrixCursor. 它使用AbstractCursor#fillWindow调用toString每个对象的实现。由于您只是发送一个字符串,它应该适合您。

于 2010-07-27T04:40:23.897 回答