5

Androidで次のようなことができるかどうか知りたいです:

public Cursor getFlowsByCategory(int type, int categoryID, int limit) {

    SQLiteDatabase db = dbHelper.getReadableDatabase();

    final String[] columns = {ID, FLAGS, SUBJECT, AMOUNT, AMOUNT_NO, CATEGORY};
    final String selection = "((" + FLAGS + " & ?) >> 1 = ?) AND (" + CATEGORY + " = ?)";
    final String[] selectionArgs = {Integer.toString(Flow.FLOW_TYPE), Integer.toString(type), Integer.toString(categoryID)};

    return db.query(TABLE, columns, selection, selectionArgs, null, null, ID + " DESC", Integer.toString(limit));

}

FLAGS は 1 バイトのビット マスクで、マスクの 2 番目のビット (位置 1) がオンになっている行のみを選択したいと考えています。マスク (Flow.FLOW_TYPE) は 0b00000010 で、型パラメーターは 0 または 1 のいずれかです。動作するはずですが、動作しません。何が間違っているのでしょうか?

4

1 に答える 1

6

このquery関数は文字列のみをパラメーターとして受け入れますが、SQLite では、数値と文字列が等しく比較されることはありません (型の親和性がある場合を除きますが、これは列の値に対してのみ機能し、式では機能しません)。

パラメータを数値に明示的に変換する必要があります。

((...) >> 1 = CAST(? AS INTEGER)) AND ...
于 2012-11-03T19:00:52.603 に答える