gpt4 book ai didi

android - IN 子句和占位符

转载 作者:IT老高 更新时间:2023-10-28 13:05:03 26 4
gpt4 key购买 nike

我正在尝试在 Android 中执行以下 SQL 查询:

    String names = "'name1', 'name2";   // in the code this is dynamically generated

String query = "SELECT * FROM table WHERE name IN (?)";
Cursor cursor = mDb.rawQuery(query, new String[]{names});

但是,Android 不会将问号替换为正确的值。我可以执行以下操作,但这并不能防止 SQL 注入(inject):

    String query = "SELECT * FROM table WHERE name IN (" + names + ")";
Cursor cursor = mDb.rawQuery(query, null);

我怎样才能绕过这个问题并能够使用 IN 子句?

最佳答案

"?, ?, ..., ?" 形式的字符串可以是动态创建的字符串并安全地放入原始 SQL 查询中(因为它是一种受限形式,不包含外部数据),然后占位符可以正常使用。

考虑一个函数 String makePlaceholders(int len) ,它返回 len 用逗号分隔的问号,然后:

String[] names = { "name1", "name2" }; // do whatever is needed first
String query = "SELECT * FROM table"
+ " WHERE name IN (" + makePlaceholders(names.length) + ")";
Cursor cursor = mDb.rawQuery(query, names);

只需确保传递与位置一样多的值。默认最大值limit of host parameters在 SQLite 中是 999 - 至少在正常构建中,不确定 Android :)


这是一种实现方式:

String makePlaceholders(int len) {
if (len < 1) {
// It will lead to an invalid query anyway ..
throw new RuntimeException("No placeholders");
} else {
StringBuilder sb = new StringBuilder(len * 2 - 1);
sb.append("?");
for (int i = 1; i < len; i++) {
sb.append(",?");
}
return sb.toString();
}
}

关于android - IN 子句和占位符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7418849/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com