Hämta ur databas i omvänd ordning, hjälp!

Discussion in 'Frågor, support och diskussion' started by mardox, Nov 15, 2010.

  1. mardox

    mardox Kid Droid Medlem

    Joined:
    Jan 31, 2010
    Messages:
    73
    Likes Received:
    6

    MINA ENHETER

    Hej,

    jag har en röstanteckningsapp som fungerar bra men det finns en sak jag vill ändra.

    jag har en sql lite databas som håller alla röstanteckningars titel som strängar den har även ett id tillhörande varje databas inlägg.

    när jag hämtar data från databasen för att populera min lista så hämtas det första inlägget i databasen först och på så sätt skrivs först i listan. jag vill göra tvärt om, hämta det senast inlagda först så den kommer högst i listan.

    jag har försökt med det här under lång tid nu utan framgång. det som jag trodde skulle funka men som ger mig ett error är följande:

    public Cursor fetchAllDates() {

    return mdiktationsDb.query(DATABASE_TABLE, new String[] {KEY_DATEID, KEY_DATE}, "GROUP BY KEY_DATEID DESC" , null, null, null, null );
    }

    logcat error: ERROR/AndroidRuntime(12368): android.database.sqlite.SQLiteException: near "GROUP": syntax error: , while compiling: SELECT _id, date FROM dates WHERE GROUP BY KEY_DATEID DESC

    väldigt tacksam för all hjälp jag kan få!
     
  2. Kaj

    Kaj Senior Droid Medlem

    Joined:
    Jun 12, 2009
    Messages:
    1 768
    Likes Received:
    44

    MINA ENHETER

    Det är väl order by du vill göra och inte group by?
     
  3. mardox

    mardox Kid Droid Medlem

    Joined:
    Jan 31, 2010
    Messages:
    73
    Likes Received:
    6

    MINA ENHETER

    Även provat med order by men får exakt samma fel bara byt ut group mot order i error medelandet ..
     
  4. tomas_b

    tomas_b Kid Droid Medlem

    Joined:
    Mar 23, 2010
    Messages:
    97
    Likes Received:
    4

    MINA ENHETER

    Det är inte en sådan "enkel" grej som att du har KEY_DATEID i en variabel/konstant i din klass eller har kolumnen det namnet?
     
  5. mardox

    mardox Kid Droid Medlem

    Joined:
    Jan 31, 2010
    Messages:
    73
    Likes Received:
    6

    MINA ENHETER

    Jo alltså jag har baserat detta på notepad tutorialen och då sättar man KEY_DATEID till "_id" som en final variabel. Har inte arbetat nåt med databser egentligen så vet inte vad jag kan och inte kan ändra / vad jag ska ändra
     
  6. Kaj

    Kaj Senior Droid Medlem

    Joined:
    Jun 12, 2009
    Messages:
    1 768
    Likes Received:
    44

    MINA ENHETER

    Hm, har inte du order by på fel ställe? Javadoc:en för query i SQLiteDatabase
    säger:

    Code:
    public Cursor query(
        String table, 
        String[] columns, 
        String selection, 
        String[] selectionArgs, 
        String groupBy, 
        String having, 
        String orderBy)
    
     
  7. mardox

    mardox Kid Droid Medlem

    Joined:
    Jan 31, 2010
    Messages:
    73
    Likes Received:
    6

    MINA ENHETER

    Nej asså i det jag skrev ovan använd jag group by men när jag bytte till order by bytte jag såklart även platsen i query
     
  8. Rheo

    Rheo Infant Droid Medlem

    Joined:
    Nov 14, 2010
    Messages:
    7
    Likes Received:
    0

    MINA ENHETER

    För det första, läs dokumentationen. Den har svaret på din fråga.
    http://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html

    För det andra, titta på den genererade SQL-frågan som syns i felmeddelandet, så märker du att det står WHERE där det inte ska stå WHERE: SELECT _id, date FROM dates WHERE GROUP BY KEY_DATEID DESC

    Nu till lösningen, i fall du inte vill klura på den själv: Ska du sortera är det ORDER BY. GROUP BY är för att lägga ihop liknande rader. Detta ska anges i argumentet orderBy, inte selectionArgs så som du har lagt det. Ändra till: query(DATABASE_TABLE, new String[] {KEY_DATEID, KEY_DATE}, null, null, null, null, KEY_DATEID + " DESC");

    Koden kan även göras mer överskådlig för att undvika syntaxfel genom att använda funktionen rawQuery i stället för den patetiska funktionen query. I så fall blir det: rawQuery("SELECT " + KEY_DATEID + ", " + KEY_DATE + " FROM " + DATABASE_TABLE + " ORDER BY " + KEY_DATEID + " DESC", null);

    Ett tips också: Du har väl kommit ihåg att göra kolumnen KEY_DATEID till en nyckel/index i din CREATE TABLE?
     
  9. mardox

    mardox Kid Droid Medlem

    Joined:
    Jan 31, 2010
    Messages:
    73
    Likes Received:
    6

    MINA ENHETER

    Tack så mycket! Ja KEY_DATEID är ett index :) skall prova de här lösninarna när jag kommer tillbaks till datorn!
     
  10. PatrikS

    PatrikS Senior Droid Medlem

    Joined:
    Jun 29, 2009
    Messages:
    1 123
    Likes Received:
    65

    MINA ENHETER

    och som Rheo och Kaj sade läs dokumentationen, du hoppar ju tydligen över det inbyggda fältet för orderby med att sätta null där.
    (Det sista fältet i metodanropet)
     
  11. yrara

    yrara Teen Droid Medlem

    Joined:
    Sep 30, 2009
    Messages:
    428
    Likes Received:
    8

    MINA ENHETER

    Det här är frågan som genereras utifrån din kod
    Titta även på dokumentationen som Kaj skickar (i Eclipse ser du även vilka parametrar en metod förväntar sig genom Ctrl+Space):
    Code:
    public Cursor query(
        String table, 
        String[] columns, 
        String selection, 
        String[] selectionArgs, 
        String groupBy, 
        String having, 
        String orderBy)
    Du skickar alltså in "GROUP BY KEY_DATEID DESC" som tredje parameter, dvs som selection. Här förväntas du skicka in urvalskriterier för frågan - det är därför den lägger till "WHERE" framför det du skickar in där.

    Byter du ut det mot ORDER BY ... så kommer det mycket riktigt att bli i stort sett samma fel, eftersom inte heller det kan följa direkt efter WHERE. Ifall du inte vill att något WHERE skall läggas till automatiskt, så skickar du null som tredje parameter. Ifall du inte vill specificera selectionArgs, groupBy eller having så skickar du null där med. Ifall du sedan vill skicka in ORDER BY så skickar du det (som du ser i metod-signaturen) som det sista argumentet. Eftersom WHERE lades till vid selection kan vi gissa att ORDER BY kommer att läggas till vid orderBy, så där skickar du i så fall bara in "KEY_DATEID DESC".