Room SQLite中带参数的LIKE删除语句失效问题求助
解决Room中LIKE语句通配符失效的问题
我之前也踩过这个Room的小坑!问题出在Room不会自动为绑定的参数添加LIKE所需的%通配符——你当前的SQL语句里,:reservationCode会被当作完整的匹配字符串,而不是模糊匹配的模式,所以自然找不到要删除的记录。
给你两种可行的解决方案:
方案1:在SQL语句中拼接通配符
直接利用SQLite的字符串连接操作符||,把%和参数拼接起来,这样Room在绑定参数时会自动把通配符整合到匹配模式里:
const val DELETE_BY_RESERVATION_CODE = "DELETE FROM ${TdaRoomDatabase.TABLE_REQUESTS} WHERE uri LIKE '%' || :reservationCode || '%'"
这种方式适合你固定需要前后模糊匹配的场景。
方案2:在调用方法时手动添加通配符
如果需要更灵活的匹配方式(比如前缀匹配、后缀匹配),可以在传入参数时手动加上%:
// 示例:前后模糊匹配 dao.deleteRequest("%$yourReservationCode%") // 前缀匹配(uri以指定代码开头) dao.deleteRequest("$yourReservationCode%") // 后缀匹配(uri以指定代码结尾) dao.deleteRequest("%$yourReservationCode")
额外注意事项
如果你的reservationCode可能包含SQLite的特殊匹配字符(比如%或_),记得要转义这些字符,否则它们会被当作通配符处理,导致匹配结果不符合预期。可以写个简单的工具方法来处理:
fun escapeLikePattern(rawPattern: String): String { return rawPattern.replace("%", "\\%") .replace("_", "\\_") } // 使用示例 val safeCode = escapeLikePattern(userInputCode) dao.deleteRequest("%$safeCode%")
内容的提问来源于stack exchange,提问作者Bryen
相关产品推荐
相关产品推荐

