Android SQLite按名称查询数据 getByTitle方法调用报错排查
问题排查结论
你这段数据库查询逻辑有3个会直接触发报错/取不到数据的问题,逐个修正即可:
- 第一个核心错误:查询条件和方法逻辑不匹配。你的方法命名是
getByTitle,入参是标题字符串,但SQL语句的WHERE条件写的是_id=?,相当于把字符串类型的标题值传给整数类型的_id字段做匹配,类型不匹配会直接触发查询错误。如果确实是按标题查询,把WHERE后的条件改成你表中存储标题的字段匹配即可,比如WHERE title=?;如果你实际是要按_id查询,那这个方法的入参就不应该传标题字符串,要传对应_id的数值类型参数。 - 第二个错误:Cursor取值索引越界。SQL查询返回的列一共6个,列索引从0开始计数,对应关系是
_id(0)、subject(1)、desciption(2)、serverity(3)、lat(4)、lon(5),你写的getDouble(6)、getDouble(7)超出了Cursor的列范围,就算查询成功也会抛出越界异常。 - 第三个错误:查询返回Cursor后没有移动游标。rawQuery返回的Cursor默认停留在第一行数据之前的位置(索引-1),不调用移动游标的方法直接取值,会触发无效位置异常。
额外注意:你SQL里写的字段名
desciption、serverity存在拼写错误,如果建表时用的是正确拼写description、severity,这里会报列不存在的错误,和你实际表结构对齐即可。
修正后代码
DatabaseHelper 部分
public Cursor getByTitle(String Title){ String[] args = {Title}; // 这里title替换成你表中实际存储标题的字段名 return getReadableDatabase().rawQuery( "SELECT _id,subject,desciption,serverity, lat ,lon FROM main WHERE title=?",args); } public double getLatitude(Cursor c){ return c.getDouble(4); } public double getLongitude(Cursor c){ return c.getDouble(5); }
Activity 调用部分
Cursor c = helper.getByTitle(TitleStr); double lat = 0; double lon = 0; // 先移动游标判断是否存在查询结果,再取值 if (c.moveToFirst()) { lat = helper.getLatitude(c); lon = helper.getLongitude(c); } // 用完关闭Cursor避免内存泄漏 c.close();
内容的提问来源于stack exchange,提问作者LucK
相关产品推荐
相关产品推荐

