在自定义ContentProvider填充Window()方法中怎么做?

时间:2010-07-27 03:29:52

标签: android android-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 个答案:

答案 0 :(得分:1)

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