光标索引超出界限异常:索引-1请求大小为0

时间:2013-03-30 13:51:18

标签: android sqlite exception cursor

我只是想在多个表中搜索数据。如果第一个表(tab1)中没有where条件数据,那么它必须在第二个表(tab2)中搜索,但是我得到的异常显示了

  

光标索引超出界限异常:索引-1请求大小为0

这是我的代码

SQLiteDatabase db=openOrCreateDatabase("train",SQLiteDatabase.CREATE_IF_NECESSARY, null);
Cursor c1;
String[] table={"tab1","tab2","tab3","tab4"};
int i=0;
do {
   c1 = db.rawQuery("select * from '"+table[i]+"' where name='Triplicane'", null);
i++;    

} while(c1 == null);

int id1=c1.getInt(0);
String nam1=c1.getString(1);
Toast.makeText(fare.this,"ID no:"+id1, Toast.LENGTH_LONG).show();       
Toast.makeText(fare.this,"name"+nam1, Toast.LENGTH_LONG).show();

3 个答案:

答案 0 :(得分:10)

所以从一开始。隐含地,每个 Cursor 位于第一行之前,因此如果您想使用它,则需要调用

cursor.moveToFirst()

如果不是空的话,将Cursor移动到第一行,然后准备工作。如果Cursor为空,则只返回 false 。所以我现在提到这个方法是非常方便的指示你的光标是否有效。

正如我的建议,我建议你改变你的代码,因为我觉得它被破坏了,听起来像是“意大利面条代码”

Cursor c = null;
String[] tables = {"tab1", "tab2", "tab3", "tab4"};
for (String table: tables) {
   String query = "select * from '" + table + "' where name = 'Triplicane'";
   c = db.rawQuery(query, null);
   if (c != null) {
      if (c.moveToFirst()) { // if Cursor is not empty
         int id = c.getInt(0);
         String name = c.getString(1);
         Toast.makeText(fare.this, "ID: " + id, Toast.LENGTH_LONG).show();       
         Toast.makeText(fare.this, "Name: " + name, Toast.LENGTH_LONG).show();
      }
      else {
         // Cursor is empty
      }
   }
   else {
      // Cursor is null
   }
}    

说明:

现在我想告诉你一些建议:

  • 使用参数化语句是非常好的做法,所以在a 未来如果您将使用语句,请在其中使用占位符。然后你的陈述变得更具人性化,更安全(SQL Injection)和更快。

  • 创建静态的最终字段也是一种非常好的做法 你的列名,表名等和使用 getColumnIndex(<columnName>)方法,以避免“拼写错误”,这是非常糟糕的。

答案 1 :(得分:0)

你的Cursor标志为空行,在Sqlite游标指向行号-1, 然后,如果您使用c.moveNext()c.moveToFirst(),您将能够“逐行”读取行

答案 2 :(得分:0)

在从光标获取数据之前写cursor.movetoFirst()