2009-05-04 9 views
30

Ich habe eine Android-App mit einer lokalen SQLite-Datenbank.Android: ORDER BY in Abfrage

private SQLiteDatabase mDb; 

, wenn ich diese Abfrage ausführen bekomme ich meinen Cursor über Zeilen mit pid gleich id, wie gewünscht:

mDb.query(true, PT_TABLE, new String[] {KEY_PID, KEY_TID}, 
    KEY_PID+" = "+id, null, null, null, null, null);   

, wenn ich die folgende Abfrage ausführen, die gleiche Ergebnismenge zu erhalten Ziel, bestellt von pid erhalte ich "android.database.sqlite.SQLiteException: datatype Mismatch"

mDb.query(true, PT_TABLE, new String[] {KEY_PID, KEY_TID}, 
    KEY_PID+" = "+id, null, null, null, null, KEY_PID+" DESC"); 

Irgendwelche Ideen?

Antwort

36

Es sieht so aus, als ob Sie nur ein bisschen durcheinander geraten sind. Gemäß der SQLiteDatabase.query Dokumentation ist das letzte Argument die LIMIT Klausel. Die vorletzte ist die ORDER BY Klausel.

Cursor query (boolean distinct, 
      String table, 
      String[] columns, 
      String selection, 
      String[] selectionArgs, 
      String groupBy, 
      String having, 
      String orderBy, // <-- ORDER BY 
      String limit) 

EDIT

Aber es gibt auch eine andere SQLiteDatabase.query wo ORDER BY letzte sein würde

Cursor query (String table, 
      String[] columns, 
      String selection, 
      String[] selectionArgs, 
      String groupBy, 
      String having, 
      String orderBy) 
+8

In der Dokumentation gibt es sieht auch eine Version sein: SQLiteDatabase.query (Tabelle, Spalten, Auswahl, selectionArgs, groupBy, mit, orderBy) <- ein Feld bemerken (die Grenze) ist –

+0

fehlt, was falsch ist , erwähnt doc gibt auch den folgenden Aufruf 'Abfrage (String-Tabelle, String [] Spalten, String-Auswahl, String [] selectionArgs, String groupBy, String mit, String orderBy)'. – 2ndGAB

+0

@ 2ndGAB: Eigentlich ist die Methode, die Sie erwähnen, dieselbe, die Dandre erwähnt und Sandip in seiner Antwort verwendet, und ist nicht die in Bees Frage. Beachten Sie, dass sie unterschiedliche Aritäten haben (7 vs. 9), und Ihrerseits keinen booleschen Wert ("distinct" von der in der Frage verwendeten Methode) verwendet. – outis

7
KEY_PID + " = " + "'" + id + "'" 
23

Das ist für mich gearbeitet

String filter = MySQLiteHelper.JOB_ID + "=" + Integer.toString(jobID); 
String orderBy = MySQLiteHelper.LOG_TIME + " DESC"; 
Cursor cursor = database.query(MySQLiteHelper.LOG_TABLE_NAME, logTableColumns, 
     filter, null, null, null, orderBy); 
4

Da Orderby der zweitletzte Parameter in der Abfrage ist; Ihre Abfrage wie diese

mDb.query(true, PT_TABLE, new String[] {KEY_PID, KEY_TID}, 
    KEY_PID+" = "+id, null, null, null, KEY_PID+" DESC", null); 
2

wäre, wenn ich das richtig das Problem zu verstehen, versuchen Sie dies.

String[] columns = new String[] {KEY_PID, KEY_TID}; 
    String where = KEY_PID + " = " + Integer.toString(id); 
    String orderBy = KEY_PID + " DESC"; 

    Cursor cursor = mDb.query(PT_TABLE, columns, where, null, null, null, orderBy); 
+0

Fügen Sie einige Erklärung mit der Antwort für diese Antwort helfen OP bei der Behebung des aktuellen Problems –