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

Android SQLite:搜索获取行数据及搜索按钮崩溃问题求助

嘿,你的搜索功能触发崩溃这事,我遇过不少类似情况,大概率是当前Cursor处理逻辑有漏洞(比如没正确初始化、空指针或者资源没释放),或者直接拼接SQL语句搞出了语法错误/注入风险。给你几个靠谱的替代实现,既能解决崩溃,还更安全:

方法1:用SQLiteDatabase的query()方法(官方推荐,防注入)

这是Android SQLite官方最推荐的写法,用参数化查询避免手动拼SQL的坑,逻辑也更清晰:

public String getName(String nameSearch) throws SQLException {
    // 定义要查询的列
    String[] columns = new String[]{KEY_ROWID, KEY_NAME, KEY_PROGRAMANDYEARLVL, KEY_CLASSANDSECN, KEY_GRADE};
    // 用?做占位符,避免SQL注入和语法错误
    String selection = KEY_NAME + " = ?";
    String[] selectionArgs = new String[]{nameSearch};
    
    // 执行查询,替换YOUR_TABLE_NAME为你的实际表名
    Cursor c = ourDatabase.query(
            YOUR_TABLE_NAME,
            columns,
            selection,
            selectionArgs,
            null, // 不需要分组就传null
            null, // 不需要having条件就传null
            null  // 不需要排序就传null
    );
    
    String result = null;
    // 务必先判断Cursor不为空,再操作
    if (c != null) {
        // 移动到第一条匹配的记录
        if (c.moveToFirst()) {
            // 这里根据需求取对应字段,比如取KEY_NAME的值
            result = c.getString(c.getColumnIndex(KEY_NAME));
        }
        // 用完Cursor一定要关闭,避免内存泄漏
        c.close();
    }
    return result;
}
方法2:用SQLiteQueryBuilder构建复杂查询

如果之后需要扩展成多条件、多表关联的复杂查询,用SQLiteQueryBuilder会更灵活:

public String getName(String nameSearch) throws SQLException {
    SQLiteQueryBuilder queryBuilder = new SQLiteQueryBuilder();
    // 设置要查询的表
    queryBuilder.setTables(YOUR_TABLE_NAME);
    
    String[] columns = new String[]{KEY_ROWID, KEY_NAME, KEY_PROGRAMANDYEARLVL, KEY_CLASSANDSECN, KEY_GRADE};
    String selection = KEY_NAME + " = ?";
    String[] selectionArgs = new String[]{nameSearch};
    
    Cursor c = queryBuilder.query(
            ourDatabase,
            columns,
            selection,
            selectionArgs,
            null,
            null,
            null
    );
    
    String result = null;
    if (c != null) {
        if (c.moveToFirst()) {
            result = c.getString(c.getColumnIndex(KEY_NAME));
        }
        c.close();
    }
    return result;
}
几个关键崩溃排查点
  • 确认ourDatabase已经正确初始化,并且没有被提前关闭,不然会触发空指针异常
  • 绝对不要直接把用户输入的nameSearch拼进SQL语句(比如"SELECT * FROM table WHERE name = '" + nameSearch + "'"),用户输入带单引号的内容直接就会搞崩SQL语法,还会有SQL注入风险
  • 必须检查Cursor是否为null,用完后一定要关闭,避免内存泄漏和Cursor相关的运行时异常
  • 如果需要返回多条匹配数据,建议用List<String>或者自定义实体类来存储,不要只返回单个String

内容的提问来源于stack exchange,提问作者Angelo Tabada

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:57:11