在SQL中使用LIKE StateMent的Android单引号

时间:2011-05-26 23:50:59

标签: java android sql

我在使用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。和合

5 个答案:

答案 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)

Android的数据库API位于sqlite之上。在其常见问题解答中,您可以看到“逃避”单引号,您只需使用两个单引号。请参阅here