如何在android项目中的sqlite查询中传递字符串变量?

时间:2017-10-02 17:34:27

标签: android sqlite

Cursor resultset=mydb.rawQuery("SELECT Name FROM Birds WHERE Size LIKE "+"'"+size+"'"+" AND Color1 LIKE "+"'"+color1+"'"+" AND Color2 LIKE "+"'"+color2+"'"+" AND Habitat LIKE "+"'"+habitat+"'"+";",null);

Cursor resultset=mydb.rawQuery("SELECT Name FROM Birds WHERE Size LIKE 'Duck%' AND Color1 LIKE 'Orange%' AND Color2 LIKE 'White%' AND Habitat LIKE 'Wetland%';",null);

Cursor resultset=mydb.rawQuery(sql,null); resultset.moveToFirst(); name=resultset.getString(0);

第一个语句Cursor结果集包含字符串变量名,但它显示错误 - android.database.CursorIndexOutOfBoundException:请求索引0,大小为0.

执行第二个语句Cursor结果集Duck是数据库中Size列下的值, 橙色是数据库中Color1列下的值 和白色是数据库

中Color2列下的值

所以我不知道改进第一个sqlite查询,所以它实际上工作 因为字符串变量size,color1和color2正在使用实际值进行更新。

2 个答案:

答案 0 :(得分:3)

你试过吗?

Cursor resultset=mydb.rawQuery("SELECT Name FROM Birds WHERE Size LIKE ? AND Color1 LIKE ? AND Color2 LIKE ? AND Habitat LIKE ?",null);
String[] arguments= new String[]{"Duck%", "Orange%", "White%", "Wetland%"};
sqLiteDatabase.rawQuery(queryString, arguments);

希望这有帮助

答案 1 :(得分:0)

第一个是有效但不选择任何行,越界问题是因为Cursor为空并且您有以下内容: -

Cursor resultset=mydb.rawQuery(sql,null); // OK
resultset.moveToFirst(); // OK BUT WILL ALLOW EMPTY CURSOR
name=resultset.getString(0); // OUT OF BOUNDS IF EMPTY CURSOR

相反,你应该使用类似的东西: -

Cursor resultset=mydb.rawQuery(sql,null);
if (resultset.moveToFirst()) {
    name=resultset.getString(0);
}

也就是说,moveToFirst方法返回一个布尔值,指示是否可以完成移动,并且应该检查这一点以查看移动是否实际上已完成且存在实际上是要处理的一行。

注意!你应该在没有返回任何行时处理这种情况。