1

我只是想在多个表中搜索数据。如果第一个表(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();
4

3 回答 3

10

所以从一开始。隐式地,每个光标都位于第一行之前,所以如果你想使用它,你需要调用

cursor.moveToFirst()

如果不为空,则将光标移动到第一行,然后准备工作。如果 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
   }
}    

笔记:

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

  • 参数化语句的使用是非常好的做法,因此将来如果您要使用语句,请在其中使用占位符。然后,您的语句变得更易于阅读、更安全(SQL Injection)和更快。

  • 创建静态最终字段来保存您的列名、表名等,并使用 getColumnIndex(<columnName>)方法来避免正在寻找非常糟糕的“拼写错误”,这也是一个非常好的做法。

于 2013-03-30T14:01:59.847 回答
0

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

于 2013-03-30T14:53:44.247 回答
0

cursor.movetoFirst()在从游标获取数据之前写入 。

于 2013-03-30T14:56:39.237 回答