Android 查询()中运算符中的SQLite

Android 查询()中运算符中的SQLite,android,sqlite,Android,Sqlite,我这样称呼SQLite String[] args = new String[]{"(A,B)"} Cursor cur = db.query("tab1", null, "name in ?", args, null, null, null); 和接收异常: android.database.sqlite.SQLiteException: near "?": syntax error: , while compiling: SELECT * FROM tab1 WHERE name in ?

我这样称呼SQLite

String[] args = new String[]{"(A,B)"}
Cursor cur = db.query("tab1", null, "name in ?", args, null, null, null);
和接收异常:

android.database.sqlite.SQLiteException: near "?": syntax error: , while compiling: SELECT * FROM tab1 WHERE name in ?
如何在查询()中使用运算符

我已经试过了

String[] args = new String[]{"('A','B')"}

若我并没有弄错的话,arg解析不适用于IN子句。所以在WHERE子句中不能使用“?”

你应该这样做:

String args = "A, B";
Cursor cur = db.query("tab1", null, "name in (" + args + ")", null, null, null, null);

如果需要的话,可以用一个循环来构建args。

在一个项目中,我发现其他问题(和答案)很有帮助:

String[] args = new String[]{A,B} // if A, B are variables
String[] args = new String[]{"A","B"}    
Cursor cur = db.query("tab1", null, "name in (?,?)", args, null, null, null);  
  • 以下是我发现有效的方法:

    String[] args = new String[] {"A", "B"};
    Cursor cur = db.query("tab1", null, "name in(?,?)", args, null, null, null);
    
    我也将:

    String args = "A, B";
    Cursor cur = db.query("tab1", null, "name in(" + args + ")", null, null, null, null);
    


    因此,您可以将多个
    IN()
    语句一起使用,并将每个
    selectionArgs
    数组中的一个元素匹配(如第一个示例)。如果在
    WHERE
    子句中有多个条件,请确保将
    selectionArgs
    中的正确元素匹配:

    String[] args = new String[] {"Current", "A", "B"};
    Cursor cur = db.query("tab1", null, "IsCurrent=? AND name in(?,?)", args, null, null, null);
    

    或者,您可以直接在
    选择
    字符串本身的
    in()
    语句中使用由逗号划定的参数组成的字符串(如第二个示例)




    引用的问题似乎表明您可以在
    in()
    中使用单个
    ,并以某种方式扩展相关参数,但我无法使其正常工作。

    如果我理解正确,您可以这样解决您的问题:

    List<String> exercise =  new ArrayList<>();
    exercise.add(parameter1);
    exercise.add(parameter2);
    exercise.add(parameter3);
    
    Cursor cursor = sqLiteDatabase.rawQuery("SELECT * FROM exersisesenglish WHERE sex " + " 
    =?" + " AND level" + "=?" + " AND wish" + "=?" + " AND place" + "=?" + " AND lang" + 
    "=?" +" AND stay_exersise IN (" + exercise.get(0) + "," + exercise.get(1) + "," + 
    exercise.get(2) + "," + exercise.get(3) + ")", new String[]{String.valueOf(sex), 
    String.valueOf(level), String.valueOf(wish), String.valueOf(place), 
    String.valueOf(loc)});
    
    List exercise=new ArrayList();
    增加(参数1);
    增加(参数2);
    增加(参数3);
    Cursor Cursor=sqLiteDatabase.rawQuery(“SELECT*FROM exercisesenglish WHERE sex”+”
    =?“+”和级别“+”=?“+”并希望“+”=?“+”和放置“+”=?“+”和lang”+
    “=?”+“并在(“+exercise.get(0)+”,“+exercise.get(1)+”,“+
    exercise.get(2)+“,“+exercise.get(3)+”,新字符串[]{String.valueOf(sex),
    String.valueOf(level)、String.valueOf(wish)、String.valueOf(place),
    String.valueOf(loc)});
    
    Never的可能副本从不从字符串构造任何sql部分。它容易受到sql注入的攻击。@petermm我不知道sql注入的主题(除了始终使用参数化sql调用的规则),因此即使所有数据都来自应用程序内部,也可能有来自查询的注入攻击。。。或者,如果发送到应用程序外部的SQLite db,查询字符串可能会损坏?关键是,所有请求(应该)通过相同的方法(在本例中为query())。如果query()易受攻击且已修复,那么它将不再(或更少)易受攻击。您的观点“如果所有数据都来自应用程序内部”,当开发人员发现“upss,有人可能会在此处注入不受控制的数据”时,他们会大吃一惊。我们很聪明,但事实上,黑客更聪明。由于SQL注入漏洞,不应使用字符串连接的方法。正如Python的psycopg2文档通常所说:“永远,永远,永远,永远,永远,永远,永远,永远,永远,永远,永远,永远,永远,永远,永远,永远,永远,永远,永远,永远,永远,永远,永远,永远,永远,永远,永远,永远,永远,永远,永远,永远,永远,永远,永远,永远,永远,永远,永远,永远,永远,永远,永远,永远,永远,永远,永远。正确的方法是第一种,即
    String[]args=newstring[]{“A”,“B”};游标cur=db.query(“tab1”,null,“名称在(?,)”,args,null,null,null)使用selection和selectionArgs参数这容易受到SQL注入的攻击。如果有许多元素,可以通过编程方式构造包含占位符的选择,并将值作为SelectionAgs参数传递。在任何情况下,您都不应该使用字符串连接或格式使用值构建查询当变量来自动态列表时如何清理?