【问题标题】:Using Cursor as a base to build an Iterator使用 Cursor 作为基础构建迭代器
【发布时间】:2016-01-10 01:35:12
【问题描述】:

我计划基于Cursor 构建一个Iterator,我将通过数据库查询获得:

  @Override public Iterator<Title> iterator() {
    final Cursor cursor = /* Gets a Cursor of Titles from DB */;
    final Iterator<Title> iterator = new Iterator<Title>() {
      @Override public boolean hasNext() {
        return !cursor.isLast();
      }

      @Override public Title next() {
        cursor.moveToNext();

        return new CursorTitle(cursor);
      }

      @Override public void remove() {
        try {
          removeTitle(new CursorTitle(cursor));
        } catch (TitleNotFoundException e) {
          throw new AssertionError();
        }
      }
    };

    cursor.close();

    return iterator;
  }

但我一直遇到异常,因为我基本上是在尝试从已关闭的 Cursor 获取数据。

我知道我在这里问了一些很奇怪的问题;但我只是好奇。有没有办法让这个工作?

提前致谢。

p.s.,我可能会通过不关闭 Cursor 并收工来逃脱。但是来吧,那太白痴了。

【问题讨论】:

  • 你可能想在你的迭代器中添加一个新方法来包装cursor.close()。并找出你想在光标上调用 close 的时间。
  • 嗯.. 这实际上是个好主意!我会尝试一下。

标签: android android-sqlite android-cursor


【解决方案1】:

cursor.close(); 正在你的iterator 中运行,所以一旦这个迭代器启动,光标就会关闭,这就是你的错误存在的原因,所以只需删除它其他方法,你确定它会在你不执行时执行'不再需要它保持打开状态。

【讨论】:

  • 构造函数..在哪里?我不记得在这个问题中给出了我的任何构造函数代码。
  • 对不起,不是构造函数,是iterator 方法。
猜你喜欢
  • 2016-10-28
  • 2012-03-12
  • 1970-01-01
  • 2011-01-12
  • 2018-11-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多