Android Sqlite IN,NOT IN语法

我正在尝试运行NOT IN select NOT IN列表是动态的。 就像是

 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 

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

  • Android棒棒糖5.0.1 SQLiteLog POSIX错误11 SQLite错误:3850
  • Android中的“-journal”SQLite数据库是什么?
  • 自定义ListView和Date作为SectionHeader(使用自定义SimpleCursorAdapter)
  • Android 2.1和2.2之间的SQLite差异
  • 如何在Android SQlite中添加布尔列
  • 如何限制Android SQLite表中的行数
  • Android设备监视器“数据”文件夹为空
  • 为什么ContentValues有一个支持Boolean的put方法?
  • 你不能只放一个’?’ 而不是值列表。 因此,尝试参数化列表几乎没有什么好处。 当然,人们可以创建2,4,16值准备语句..." type NOT IN (?,?)", new String[]{ "connect","answer" },...但即便如此具有远程RDBMS的服务器,它具有可疑的价值。 相反,做

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

    如果列表是动态的,则必须转义字符串并将它们放入单引号列表中。

    您可以使用String.format动态设置args。

    例如:

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

    =>

     String argsArrayToString(List args) { StringBuilder argsBuilder = new StringBuilder(); argsBuilder.append("("); final int argsCount = args.size(); for (int i=0; i 

    如果动态创建包含“not in”值列表的String,然后将它们附加到sql字符串的末尾,则可以动态使用“not in”,如下所示:

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