You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 10:51:22