我在使用sql LIKE语句时查询单引号时遇到问题
这是我在SD卡中搜索MUSIC文件的SQL查询。
final Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
final String[] cursor_cols = {
MediaStore.Audio.Media.TITLE
};
where = MediaStore.Audio.Media.TITLE + " like ('%"+SomeSongTitle+"%')";
cursor = getContentResolver().query(uri, cursor_cols, where, null, null);
SomeSongTitle
是用户输入的一些任意输入文本。
我的问题是为什么当SomeSongTitle
包含单个引号(例如SomeSongTitle=don't
)时,它会崩溃。
如何解决?
感谢阅读,希望听到你们的解决方案= D。和合
答案 0 :(得分:4)
如果您不想进行字符串替换,可以使用SQLiteDatabase.rawQuery来获取Cursor对象。然后做一些像:
String query = "select * from your_table_name where" + MediaStore.Audio.Media.TITLE + " like ('%?%')";
cursor = yourDB.rawQuery(query, new String[] {SomeSongTitle});
这应该绕过引用问题。
答案 1 :(得分:3)
要修复它,您需要用两个单引号替换单引号。尝试使用像...这样的东西。
SomeSongTitle = SomeSongTitle.replace("'", "''");
答案 2 :(得分:1)
您需要转义单引号。有更复杂的方法可以做到这一点,但一个简单的方法是简单地查找和替换,以便在引用之前添加斜杠(\)标记,使其看起来像这样:(\')。
您可以阅读更多相关信息SQL Injection。 具体来说,请查看有关缓解的部分。
答案 3 :(得分:1)
如果对where子句中的参数使用绑定(?),那么您不需要也不应该使用任何单引号,因为绑定已经解决了这个问题。 特别是,绑定中的第二个参数是一个字符串数组, String [],为每个?提供一个String。在绑定过程中,每个字符串都由sql处理,就好像它周围有单引号一样。 Binding创建一个带有变量替换的已编译sql语句,因此将sql编写为固定的String和绑定是有效的,而不是每次调用都使用不同的语句。
答案 4 :(得分:0)