Android Sqlite IN, NOT IN syntax

前端 未结 3 475
臣服心动
臣服心动 2021-02-05 06:54

I\'m trying to run NOT IN select where NOT IN list is dynamic. Something like

SELECT id, type FROM CONTACTS where type NOT IN (\'connec         


        
相关标签:
3条回答
  • 2021-02-05 07:10

    You can have it dynamically use "not in" if you dynamically create a String that contains the list of "not in" values and then append them to the end of your sql string like in the following:

    public static Vector selectAllFormTypesForAccountIgnoringFormVersions(
            int accountId, String formsIgnored) {
    protected final static String selectAllFormTypesForAccountIgnoringFormVersions = "SELECT DISTINCT FormType.*"
            + " FROM FormType, Form WHERE Form.accountId=? AND FormType.formTypeContentId = Form.formTypeContentId"
            + " AND Form.formVersionId NOT IN (";
    
        Vector allFormTypes = new Vector();
        SQLiteDatabase db = null;
        String[] selectionArgs = { Integer.toString(accountId)};
    
        try {
            DataManager_Platform dataManager = (DataManager_Platform) DataManager_Platform
                    .getDataManager();
            db = (SQLiteDatabase) dataManager.getDatabase();
            Cursor cursor = db.rawQuery(
                    selectAllFormTypesForAccountIgnoringFormVersions + formsIgnored + ")",
                    selectionArgs);
    
            if (cursor.getCount() > 0) {
                cursor.moveToFirst();
                while (!cursor.isAfterLast()) {
                    FormType_Platform formType = new FormType_Platform();
                    formType.populateModel(cursor);
                    allFormTypes.add(formType);
                    cursor.moveToNext();
                }
            }
        } catch (Exception e) {
            System.out.println("Error: " + e.getMessage());
            e.printStackTrace();
        } finally {
            try {
                if (db != null) {
                    db.close();
                }
            } catch (Exception e) {
                System.out.println("Error: " + e.getMessage());
                e.printStackTrace();
            }
        }
    
        return allFormTypes;
    }
    
    0 讨论(0)
  • 2021-02-05 07:20

    You cannot place just one '?' instead of a list of values. As such, there is little to gain from trying to parametrize lists. One can, of course, create 2,4,16-value prepared statements ..." type NOT IN (?,?)", new String[]{ "connect","answer" },... but even on a server with remote RDBMS it has questionable value. Instead, do

    db.query(TABLE, new String[] { "id", ""}, " type NOT IN ('connect','answer')", 
         null, null, null, null);
    
    if the list is dynamic, you will have to escape the strings and put them into single quoted list.

    0 讨论(0)
  • 2021-02-05 07:26

    You can use String.format to dynamic set the args.

    for example:

    db.query(TABLE, new String[] { "id", ""}, " type NOT IN (?)", "connect,answer", null, null, null);
    

    =>

    String argsArrayToString(List<String> args) {
        StringBuilder argsBuilder = new StringBuilder();
        argsBuilder.append("(");
        final int argsCount = args.size();
        for (int i=0; i<argsCount; i++) {
            argsBuilder.append(args.get(i));
            if (i < argsCount - 1) {
                argsBuilder.append(",");
            }
        }
        argsBuilder.append(")");
    }
    
    db.query(TABLE, new String[] { "id", ""}, String.format(" type NOT IN (%s)", argsArrayToString(arrays)), null, null, null, null);
    
    0 讨论(0)
提交回复
热议问题