0

我有这个作为我的查询:

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 的行。

当我删除 level 周围的转义引号时,它会返回一个空光标。难道我做错了什么?

4

2 回答 2

1

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

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

but

"2" > "11"

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

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

将数据库列更改为 INTEGER 并删除查询中level周围的引号- 你会没事的。

于 2012-04-10T14:25:23.920 回答
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)。此外,我假设您将实际级别作为整数注入到您的函数中。如果不是这样,您可能希望将constraintArgsfrom更改Integer.toString(level)为其他内容。

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

于 2012-04-10T14:37:36.810 回答