我正在尝试使用来自我的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;
}


我非常怀疑我是否必须执行诸如更改数据库版本之类的操作,因为我还没有接触过数据库的架构,所以唯一要做的就是添加另一行数据。我该如何解决这些家伙?

最佳答案

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


上面的信息是很明显的,但是您需要考虑偏移量。那就是您有一个具有12行6列的游标(来自具有12行6列的CursorWindow)。

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

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

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

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

10-08 20:13