问题描述
我想知道是否可以在Android中执行以下操作:
I'd like to know if it's possible to do in Android something like this:
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.它应该可以工作,但不能这样做:我在做什么错了?
FLAGS is a 1-byte bit mask and I'd like to select only the rows which has the second bit (position 1) of the mask on. The mask (Flow.FLOW_TYPE) is 0b00000010 and the type parameter can be either 0 or 1. It should work but it doesn't: what am I doing wrong?
推荐答案
query
函数仅接受字符串作为参数,但是在SQLite中,数字和字符串绝不能相等(除非您具有类型相似性,但这仅适用于列值,不适用于表达式).
The query
function accepts only strings as parameters, but in SQLite, numbers and strings never compare equal (unless you have type affinity, but this works only for column values, not expressions).
您必须将参数显式转换回数字:
You have to explicitly convert the parameters back to a number:
((...) >> 1 = CAST(? AS INTEGER)) AND ...
这篇关于Android/SQLite-对WHERE子句的位操作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!