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 の行のみを返します。

レベルのエスケープされた引用符を削除すると、空のカーソルが返されます。私は何か間違ったことをしていますか?

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 に) 変更することもできます。また、実際のレベルを整数として関数に注入すると仮定しています。そうでない場合は、constraintArgsfromInteger.toString(level)を別のものに変更することをお勧めします。

ポイントは、このようにして、レベル値の解釈方法を sqlite データベース エンジンに決定させることです。

于 2012-04-10T14:37:36.810 に答える