Android Sqlite WHERE子句无法正常工作

时间:2012-04-10 14:16:27

标签: android sqlite

我将此作为我的查询:

public Cursor getQuests(int level) {
    final String[] columns = new String[] {KEY_ID, "title", "minUC", "maxUC", "xp", "ep", "request", "loot", "level", "numHits", "numHitsReq"};
    return db.query(QUESTS, columns, "level<=\"" + level + "\"", null, null, null, KEY_ID + ", level");
}

因此,我的数据库中的条目达到了10级。此查询通常可以达到一个点,而玩家等级小于10,一切都按预期工作,但是当玩家等级为11或更高时,查询只会返回等级为1的行。

当我删除级别周围的转义引号时,它返回一个空光标。我做错了吗?

2 个答案:

答案 0 :(得分:1)

您的问题很可能是由于数据库中的LEVEL列是文本/字符串。然后你将它与另一个字符串进行比较:

"1" <= "11"
"10" <= "11"
"11" <= 11"

but

"2" > "11"

但是,如果您要比较这些值,您将获得预期的结果

1 <= 11
2 <= 11
and so on
11 <= 11

将数据库列更改为INTEGER并删除查询中周围的引号 - 您就可以了。

答案 1 :(得分:0)

我建议你使用“预备语句范式”,即尝试如下:

final String table = QUESTS;
final String columns = {
    KEY_ID,
    "title",
    "minUC",
    "maxUC",
    "xp",
    "ep",
    "request",
    "loot",
    "level",
    "numHits",
    "numHitsReq"
};
final String constraint = "level<=?";
final String constraintArgs = {
    Integer.toString(level)
};
final String groupBy = null;
final String having = null;
final String orderBy = KEY_ID + ", level ASC";

db.query(table, columns, constraint, constraintArgs, groupBy, having, orderBy);

您可能希望根据需要更改排序顺序(从ASC到DESC)。另外我假设您将实际级别作为整数注入函数。如果不是这样,您可能希望将constraintArgsInteger.toString(level)更改为其他内容。

关键是这样你让sqlite数据库引擎决定如何解释级别值。