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之上。 在其常见问题解答中,您可以看到“逃避”单引号,您只需使用两个单引号。 看到这里 。
- 如果仅执行AsyncTask,则需要BroadcastReceiver唤醒锁吗?
- java.lang.IllegalStateException:您需要在此活动中使用Theme.AppCompat主题(或后代)
- 如何从android中的静态方法调用非静态方法
- Recyclerview – 顶部项目应与下一个项目重叠,依此类推
- 通过摄像头拍照并以bytearray的forms发送到服务器
- 找出填写pdf文件所需的字段
- 我已将Android API更新为23并且任何xml文件都没有错误但是当我尝试构建项目时,这显示R无法解析
- 根据条件从另一个微调器填充微调器
- 如何使用RXJava Observables处理用于填充模型的多个请求?