Android Sqlite在中,而不是在语法中

Android Sqlite在中,而不是在语法中,android,sql,sqlite,Android,Sql,Sqlite,我正在尝试运行不在选择不在列表动态的位置。差不多 SELECT id, type FROM CONTACTS where type NOT IN ('connect','answer') 在代码中,我徒劳的尝试是: db.query(TABLE, new String[] { "id", ""}, " type NOT IN (?)", "connect,answer", null, null, null); // didn't work db.query(TABLE, new St

我正在尝试运行
不在
选择
不在
列表动态的位置。差不多

SELECT id, type FROM CONTACTS where type NOT IN ('connect','answer')
在代码中,我徒劳的尝试是:

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

我的看法是,
替换将我的逗号列表视为单个参数。我确实找到了一个解决方案,但它相当难看,所以我不会在这里发布它,除非有人拿出更优雅的东西

你不能只放置一个“?”而不是一个值列表。因此,尝试将列表参数化并没有什么好处。当然,我们可以创建2,4,16值准备语句
,“输入不在(?,)”,新字符串[]{“连接”,“应答”},,
,但即使在带有远程RDBMS的服务器上,它的值也有问题。 相反,你应该这样做
如果列表是动态的,则必须转义字符串并将其放入单引号列表中。

如果动态创建一个包含“不在”值列表的字符串,然后将其附加到sql字符串的末尾,则可以动态使用“不在”,如下所示:

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;
}

可以使用String.format动态设置参数

例如:

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

字符串argsArrayToString(列表args){
StringBuilder argsBuilder=新StringBuilder();
argsBuilder.append(“”);
final int argscont=args.size();

对于(int i=0;ii如果所讨论的字符串来自您提供的列表,而不是用户提供的列表,那么您可以知道它们是安全的,甚至不必转义它们(除非它们包含“)。这就是我最终得到的解决方案。我希望有一个小把戏,但我猜没有。仍然想等待一点,看看是否会有其他更熟悉Hibernate标准的建议,其IN得到了很好的支持,但在Android SDK中找不到任何等效的建议。不要添加“(“and”)”将列表转换为字符串时
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);