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
相关产品推荐
相关产品推荐

