游标索引超出范围异常 - 导入错误?

时间:2014-09-21 21:44:30

标签: android sqlite cursor

我的sqlite数据库不能正常工作,所以为了确保我有正确的数据库,我尝试检查列,使用这个:

Cursor c = helper.getReadableDatabase().rawQuery("SELECT name FROM sqlite_temp_master       WHERE type=?",  new String[] {"table"});
 for (int i = 0; i <= c.getColumnCount(); i++){
    System.out.println(c.getString(i));}

现在,我希望这会给我数据库中所有列的名称。 但是,我遇到了一个cursoroutofboundsexception。

我是否认为这只能说我的数据库没有任何列,因此是空的?

我可以在sqlite数据库浏览器中打开数据库,因此我的导入一定有问题 - 或者我的代码是否有错误?

我的数据库是否有可能不存在,这就是为什么它不起作用?

我按照下面的答案抛弃了我的诅咒。

结果:

 09-22 03:29:31.450: I/System.out(845): >>>>> Dumping cursor       android.database.sqlite.SQLiteCursor@b2dfd7a0

现在这不是很有用。

这是否意味着没有数据库,出于什么原因,或者是否在其他地方打印?

好吧,至少有效,但结果如下:

 09-22 15:10:35.754: I/System.out(1095):    name=android_metadata

我想知道为什么没有其他列,虽然它们显然在数据库中,我可以用数据库浏览器打开文件。 这是一个典型的错误吗?

1 个答案:

答案 0 :(得分:1)

迭代光标行的典型习惯是

for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) { ... }

列索引从零开始,因此要遍历行的列,您可以执行

int columnCount = cursor.getColumnCount();
for (int i = 0; i < columnCount; i++) { ... }

但如果你想要做的就是打印出它的内容,我只需将光标移到DatabseUtils.dumpCursor(Cursor cursor)

修改

您应该从sqlite_master而不是sqlite_temp_master中进行选择,因为后者只存储有关临时表和视图的信息。