クエリにはさまざまなバリエーションがあります。すべての値の型は文字列です! (理由は聞かないでください...) 最初のものは次のようになります。
SELECT * FROM item WHERE arg1=false
引数の文字列 ("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
次のようなクエリを生成すると、「no such column: false」というエラーが表示されます。
SELECT COUNT(*) FROM item WHERE (arg1=40 OR arg2=42) AND arg3="false"
失敗しません。しかし。私はselectionargsを使用しています。私は、彼らがこの状況を避けるべきであることを読みました。しかし、そうではありません。でも、arg3 = "\"+"false"+"\"" または arg3 = "\'+"false"+"\'" または arg3="'"+"false"+ の selectionargs に入れた場合でも「」 うまくいきません。多分アンドロイド特有の問題?値「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;
}