【问题标题】:Android/SQLite - Bit operation on WHERE clauseAndroid/SQLite - WHERE 子句上的位操作
【发布时间】:2012-11-04 03:00:52
【问题描述】:

我想知道在 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 字节的位掩码,我只想选择掩码的第二位(位置 1)打开的行。掩码 (Flow.FLOW_TYPE) 是 0b00000010,类型参数可以是 0 或 1。它应该可以工作,但不能:我做错了什么?

【问题讨论】:

    标签: android sql sqlite bit-manipulation where


    【解决方案1】:

    query 函数只接受字符串作为参数,但在 SQLite 中,数字和字符串永远不会相等(除非您有 type affinity,但这仅适用于列值,不适用于表达式)。

    您必须将参数显式转换回数字:

    ((...) >> 1 = CAST(? AS INTEGER)) AND ...
    

    【讨论】:

    • 感谢您富有洞察力的回答!
    猜你喜欢
    • 1970-01-01
    • 2014-03-18
    • 2011-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多