无法从CursorWindow

时间:2017-11-07 15:26:27

标签: android sqlite android-sqlite

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

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

  

E / CursorWindow:无法从包含12行,6列的CursorWindow中读取第6行第6列。

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

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;
}

我非常怀疑我必须做一些像改变数据库版本的事情,因为我没有触及数据库的模式,只有我做的唯一事情就是添加另一行数据。我怎么能解决这个家伙?

2 个答案:

答案 0 :(得分:1)

我觉得非常尴尬地问一些非常愚蠢的东西......解决方案一直在我眼前:

我只需要使用 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();
            }
        }

我真的很舒服....

答案 1 :(得分:1)

  

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

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

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

如果游标中的行数超过表中的列数,则使用position作为列索引,如materias[f][c] = cursor.getString(cursor.getPosition());将始终导致此类错误。

您可能希望将以下内容视为问题的解决方案,也可能是更具适应性的解决方案(即不依赖于固定/硬编码数字,因为行数和列数已确定根据Cursor)

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;
}