我有不同的查询变体。所有值类型都是字符串!(不要问为什么......)第一个可能看起来像这样:
SELECT * FROM item WHERE arg1=false
arg(s) 的字符串 ("sqlWhere") 如下所示:"arg1=?"
索引 0 处 arg(s)-Array (args) 的字符串如下所示:“false”
这工作正常。我有 715 个结果。
现在,如果我有这样的事情:
SELECT * FROM item WHERE (arg1=40 OR arg2=42) AND arg3=false
我预计会有 110 个结果。但是没有任何结果,没有抛出异常
如果我要在 Firefox SQLite Manager 中生成原始查询:
SELECT COUNT(*) FROM item WHERE (arg1=40 OR arg2=42) AND arg3=false
我会得到错误:“没有这样的列:假”如果我生成这样的查询:
SELECT COUNT(*) FROM item WHERE (arg1=40 OR arg2=42) AND arg3="false"
它不会失败。但。我正在使用选择参数。我读过,他们应该避免这种情况。但他们没有。甚至,如果我为 arg3 = "\"+"false"+"\"" 或 arg3 = "\'+"false"+"\'" 甚至 arg3="'"+"false"+ "'" 不行。也许是android特定的问题?值“false”来自值列表。它用一个空字符串初始化。
查询方法如下所示:
public List<Map<String,String>> getSearchResults(String sqlWhere, String[]args)
{
List<Map<String,String>> specs = new ArrayList<Map<String,String>>();
String[] specnames = this.getSpecNames();
Cursor cursor = mDb.query(dbSchema.SpecSchema.TABLE_NAME, specnames, sqlWhere, args, null, null, dbSchema.SpecSchema._ID + dbSchema.SORT_ASC);
cursor.moveToFirst();
while(!cursor.isAfterLast())
{
Map<String, String> temp = new HashMap<String, String>();
for(int i = 0; i < specnames.length; i++)
temp.put(specnames[i], cursor.getString(cursor.getColumnIndex(specnames[i])));
specs.add(temp);
cursor.moveToNext();
}
if(cursor != null)
cursor.close();
return specs;
}