Android SQLite按指定参数(外键)筛选列求和问题求助
解决SQL求和与外键筛选的问题
嘿,我瞅见你写的SQL查询有个关键问题,咱们快速捋清楚怎么修正它!
你的当前代码里,WHERE子句只写了外键列名ID_PAC_FOREIGN,但没指定具体的筛选条件——数据库根本不知道你要筛选这个外键等于什么值,这会直接导致SQL语法错误。另外,直接拼接SQL字符串还存在SQL注入的风险,咱们一起把这些问题都解决掉:
修正步骤与完整代码示例
1. 补全WHERE条件并使用参数占位符
用?作为参数占位符来替代直接拼接值,既安全又能避免语法问题,然后在执行查询时传入具体的外键值:
// 假设你要筛选的外键值是pacId(替换成你的实际业务值) int pacId = 456; // 构造安全的SQL查询,给SUM结果起别名方便后续取值 Cursor cursor = db.rawQuery( "SELECT SUM(" + tool.CAMP_PRICE + ") AS total_amount FROM " + tool.TABLE_DATE + " WHERE " + tool.ID_PAC_FOREIGN + " = ?", new String[]{String.valueOf(pacId)} // 把外键值作为参数传入 );
2. 正确处理查询结果
SUM()函数会返回一个单值(如果没有匹配行则返回null),所以要正确从Cursor中取出这个值,同时别忘了关闭Cursor释放资源:
double totalSum = 0.0; if (cursor.moveToFirst()) { // 根据CAMP_PRICE的列类型选择getDouble或getLong // 如果是整数类型,用cursor.getLong(...)更合适 totalSum = cursor.getDouble(cursor.getColumnIndex("total_amount")); } // 务必关闭Cursor,避免资源泄漏 cursor.close();
额外注意事项
- SQL注入防护:永远不要直接把用户输入或变量拼到SQL字符串里,用
?占位符+参数传入是标准安全做法。 - 列类型匹配:如果
CAMP_PRICE是整数类型(比如INT或BIGINT),用getLong()获取结果再转成你需要的类型,避免精度丢失。 - null处理:当没有匹配的行时,
SUM()会返回null,所以初始化一个默认值(比如0.0)很有必要,避免空指针异常。
内容的提问来源于stack exchange,提问作者Eric Daniel
相关产品推荐
相关产品推荐

