【问题标题】:Couldn't read row and column from CursorWindow无法从 CursorWindow 读取行和列
【发布时间】:2017-11-08 04:53:36
【问题描述】:

我正在尝试用我的 DB SQLite 中的数据填充一个二维数组。但是会发生以下情况:

顺便说一句,这是我第一次使用 SQLite,我试图找出是否有“结果集”或“数据表”之类的东西......我找到了所谓的“光标” .好的,我开始使用它...在每个表中插入一行(一切正常),但现在当我在主题表中插入另一行时,当我尝试在光标中导航时应用程序崩溃。

E/CursorWindow:无法从有 12 行 6 列的 CursorWindow 读取第 6 行第 6 列。

我的表仅由 6 列组成,至于数据,同一个应用程序显示它有 2 行,但由于某种原因,它只读取第一行的数据而其他行没有。

public String[][] getMaterias(){
    String[][] materias = new String[rows][6];
    Cursor cursor = admin.selectLog(DBScheme.Tabla_Materias);
    cursor.moveToFirst();
    try {
        for(int f = 0; f < rows; f++){
            for(int c = 0; c < 6; c++){
                materias[f][c] = cursor.getString(cursor.getPosition());
                cursor.moveToNext();
            }
        }
    }catch (IllegalStateException ex){
        ex.printStackTrace();
    }
    return materias;
}

我非常怀疑我是否必须做一些改变数据库版本之类的事情,因为我没有触及数据库的架构,我唯一做的就是添加另一行数据。我该如何解决这些问题?

【问题讨论】:

    标签: android sqlite android-sqlite


    【解决方案1】:

    E/CursorWindow:无法从 CursorWindow 读取第 6 行第 6 列 它有 12 行 6 列。

    上面的信息非常具有解释性,但您需要考虑偏移量。那就是你有一个 12 行 6 列的 Cursor(来自一个有 12 行 6 列的 CursorWindow)。

    这意味着您可以对列使用偏移量 05,并且没有第 6 列(偏移量)。

    使用位置作为列索引,根据materias[f][c] = cursor.getString(cursor.getPosition());,如果游标中的行数超过表中的列数,总是会导致这样的错误。

    您可能希望考虑以下内容,不仅可以解决该问题,还可以作为更具适应性的解决方案(即不依赖固定/硬编码数字,因为确定了行数和列数根据光标)

    public String[][] getMaterias(){
        Cursor cursor = admin.selectLog(DBScheme.Tabla_Materias);
        String[][] materias = new String[cursor.getCount()][cursor.getColumnCount()];
    
        while(cursor.moveToNext())
            for(int c = 0; c < cursor.getColumnCount(); c++){
                materias[cursor.getPosition()][c] = cursor.getString(c);
            }
        }
        return materias;
    }
    

    也许甚至考虑通过传递一个游标(任何游标)使其更加通用:-

    public String[][] getMaterias(Cursor cursor){
        String[][] materias = new String[cursor.getCount()][cursor.getColumnCount()];
    
        while(cursor.moveToNext())
            for(int c = 0; c < cursor.getColumnCount(); c++){
                materias[cursor.getPosition()][c] = cursor.getString(c);
            }
        }
        return materias;
    }
    

    【讨论】:

      【解决方案2】:

      问一些非常愚蠢的问题我感到很尴尬......解决方案一直在我的眼中:

      我只需要用 c 变量更改 cursor.getPosition()

       for(int f = 0; f < rows; f++){
                  for(int c = 0; c < 6; c++){
                      materias[f][c] = cursor.getString(c);
                      cursor.moveToNext();
                  }
              }
      

      我真的很伤心......

      【讨论】:

        猜你喜欢
        • 2013-05-05
        • 1970-01-01
        • 2013-05-06
        • 2017-02-13
        • 2020-06-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-12
        相关资源
        最近更新 更多