2012-04-10 15 views
0

Arbeits Ich habe dies als meine Frage:Android SQLite WHERE-Klausel nicht wie erwartet

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"); 
} 

Also, ich habe Einträge bis zu Level 10 in meiner Datenbank. Diese Abfrage funktioniert normal bis zu einem Punkt, während Spieler Ebene ist weniger als 10 alles funktioniert wie erwartet, aber wenn Player Level 11 oder höher ist, die Abfrage gibt nur Zeilen mit Level = 1 zurück

Wenn ich die migrierten Anführungszeichen um level es gibt einen leeren Cursor zurück. Mache ich etwas falsch?

+0

wo ist ** QUESTS **? – waqaslam

+0

Sie müssen Ihre DB-Informationen posten ... insbesondere Ihre Erstellungs-SQL. – Barak

Antwort

1

Ihr Problem liegt höchstwahrscheinlich daran, dass die Spalte LEVEL in der Datenbank text/string ist. Dann vergleichen Sie es an eine andere Zeichenfolge:

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

but 

"2" > "11" 

Allerdings, wenn Sie die Werte vergleichen sind, werden Sie die erwarteten Ergebnisse

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

Ändern der Datenbankspalte zu INTEGER erhalten und die Anführungszeichen entfernen um Ebene in Ihrer Abfrage - und alles wird gut.

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); 

Vielleicht möchten Sie die Sortierreihenfolge ändern (von ASC DESC), je nachdem, wie Sie es wollen:

+0

Ich denke du bist richtig! +1 – kosa

+0

sqlite gibt mir diese Option nicht, es wird als NUMERIC in sqlite gesetzt, aber die Tatsache, dass ich mein int (sonst gibt es einfach einen leeren Cursor) in Anführungszeichen setzen muss, lässt mich denken, dass es als interpretiert wird Zeichenfolge, und ich kann nicht scheinen, um das zu umgehen – tomislav2012

+0

Versuchen Sie, Ihre Abfrage in einem Befehlszeilen-SQLite-Browser - ohne die Anführungszeichen - und sehen Sie, ob Sie die richtigen Ergebnisse erhalten. Wenn ja, liegt das Problem an einer anderen Stelle in der Abfrage. –

0

Ich möchte Sie mit dem „vorbereitete Erklärung Paradigma“, das heißt versuchen, wie unten empfehlen. Auch ich gehe davon aus, dass Sie die tatsächliche Ebene als eine ganze Zahl in Ihre Funktion injizieren. Wenn nicht, möchten Sie möglicherweise die constraintArgs von Integer.toString(level) zu etwas anderem ändern.

Der Punkt ist, dass Sie auf diese Weise die SQLite-Datenbank-Engine entscheiden lassen, wie der Level-Wert zu interpretieren.

+0

Ich habe deine Methode ausprobiert, und immer noch das gleiche Problem, alles wie erwartet, bis Level 10 erreicht, dann zeigt es nur Level 1 Quests ... auf Level 20 zeigt es Quests bis Level 2, auf Level 30 Level 3 und so weiter. .. Warum kann ich nicht zwingen ein int-Wert in die Abfrage? – tomislav2012

+0

Ich sehe, dass @Aleks Ihnen helfen könnte, Ihr Problem zu lösen (yeay !!! :) Dennoch würde ich Ihnen immer noch empfehlen, etwas über vorbereitete Aussagen zu lesen und solche, wenn Sie sich mit 10 Minuten Freizeit finden. Sie erhalten es (oder eine Teilmenge davon) kostenlos im Android SQLiteDatabase-Objekt, wenn Sie mit getrennten Constraint-Argumenten (die '?' - Mark-Notation in meinem Beispiel) abfragen, und es bietet Ihnen eine große Menge an Sicherheit (wie SQL) Injektion usw.). – dbm

Verwandte Themen