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