SQL中的Android单引号与LIKE StateMent

我在使用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包含一个Quote(例如SomeSongTitle=don't )时,它会崩溃。

以及如何解决它?

感谢阅读,并希望听到你们的一些解决方案= D. 呵呵

要修复它,您需要用两个单引号替换单引号。 尝试使用类似的东西……

 SomeSongTitle = SomeSongTitle.replace("'", "''"); 

如果您不想进行字符串替换,可以使用SQLiteDatabase.rawQuery来获取Cursor对象。 然后做一些像:

 String query = "select * from your_table_name where" + MediaStore.Audio.Media.TITLE + " like ('%?%')"; cursor = yourDB.rawQuery(query, new String[] {SomeSongTitle}); 

这应该绕过报价问题。

如果对where子句中的参数使用绑定(?),那么您不需要也不应该使用任何单引号,因为绑定已经解决了这个问题。 特别是,绑定中的第二个参数是一个字符串数组String [],为每个?提供一个String。 在绑定过程中,每个字符串都由sql处理,就好像它周围有单引号一样。 Binding创建一个带有变量替换的已编译sql语句,因此将sql编写为固定的String和绑定是有效的,而不是每次调用都使用不同的语句。

你需要逃避单引号 。 有更复杂的方法可以做到这一点,但一个简单的方法是简单地查找和替换,以便在引号之前添加斜杠(\) ,使它看起来像这样: (\’)

您可以阅读有关SQL注入的更多信息。 具体来说,请查看有关缓解的部分。

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