Hirdetés

Alkalmazásfejlesztés badára: Adatbáziskezelés (2. rész)

Bevezető

Ma az előző bejegyzésben elkezdett kis programunkat bővítjük ki. Az eddigi kódunk képes volt létrehozni egy adatbázist, abbe rekordokat menteni, majd ezeket megjeleníteni egy Osp::Ui::Controls::List-ben. A mostani bejegyzés végére rendezhetővé tesszük a listát, a rendezés módját a felhasználó döntheti el egy contextmenü segítségével.

A rendezés

A rendezést az SQL-lekérdezésben fogjuk alkalmazni, egyaránt használható szám és abc-szerinti rendezésre is. Az SQL parancs nagyon egyszerű, aki ezt a bejegyzést olvassa, valószínűleg ismeri; aquery végére kell beszúrni az ORDER BY szavakat, majd az oszlopok nevét vesszővel elválasztva. Alapértelmezésben növekvő sorrendben rendez, ha csökkenő sorrendet szeretnénk, a DESC szócskát kell az oszlop(ok) mögé szúrni. Lehetséges olyan eset is, amikor A oszlop szerint csökkenő, B szerint növekvő rendezést szeretnénk, ekkor minden oszlopra meghatározhatjuk a rendezést: ORDER BY a DESC, b ASC.

Contextmenu

Mint már említettem, a rendezés sorrendjét a felhasználó állíthatja be. Ehhez az Osp::Ui::Controls::ContextMenu vezérlőt fogjuk használni: ha a user megérinti a listát, egy menü jelenik meg a bökés helyén (a jelenség hasonlít az egér jobb gombjára felpattanó menüre). Ez a menü nagyon jól használható: mivel a telefonunk képernyőmérete limitált, nem mutat jól, ha telezsúfoljuk a funkcióknak megfelelő gombokkal. Így két legyet ütünk egy csapásra: megnöveljük a felhasználható terület méretét és egy jól mutató feature-rel növeljük a felhasználói élményt. A ContextMenu-t nem tudjuk a UI builder segítségével összerakni, kódból kell megoldanunk. Ez a badában szokványos kétfázisú konstruktorral történik, a Construct() függvényben kell megadnunk az “anchor” pontot (ez a menü tetején/alján lévő kis csökevény), ezt én (0,0)-ra állítottam, de mivel mindig eltolom a menüt az érintés helyére, akármit beállíthatunk ide. A Construct() második paramétere a lista típusa, ez lehet pusztán szöveges (CONTEXT_MENU_STYLE_LIST), illetve ikonokkal dúsított (CONTEXT_MENU_STYLE_ICON), a képeken mindkettő típusra láthattok példát. Az elemeket az AddItem() függvénnyel tudjuk bepakolni, LIST típus esetén csak szöveget, ICON esetében két képet, egy passzív és egy aktív bitmapet (előbbi az alapállapot, utóbbi érintés hatására jelenik meg). Természetesen az actionID-t is itt kell megadni, ezt majd az OnActionPerformed függvényben kell lekezelni.

Mutasd a kódod, megmondom ki vagy!

Aki a poszt elolvasása előtt (vagy helyett) egyenesen a példakódot kezdte böngészni, meglepődhet a rengeteg implementálatlan (van ilyen szó?) függvénycsonkon. Mivel a menüt érintésre varázsoljuk elő, implementálnunk kell az Osp::Ui::ITouchEventListener-t, ehhez pedig az összes függvényét le kell kódolnunk. Mi azt szeretnénk, hogy egyszeri érintésre megjelenjen a menü, ehhez az OnTouchPressed() belsejét kell felülírni: először eltoljuk a menüt (SetPosition()), majd megjelenítjük (SetShowState(true) és Show()). Ha a sima érintés helyett más trigger event-et szeretnénk, az ITouchEventListener függvényeiből válogathatunk: van itt duplaklikk, az ujjunk végighúzása a vezértlőn, a képernyő elengedése stb.

Magát a contextmenüt az init részben példányosítom, ikon típusú lista esetén itt történik a képek beolvasása is. A DatabaseHandler osztály getAllItems() függvényét kicsit módosítani kellett a mai bejegyzéshez, így most bemenő paraméterként egy booleant vár, a rendezés irányának megfelelően. A kód ismét letölthető innen, a következő bejegyzésben pedig tovább upgradeljük az alkalmazásunkat.

holdmester

Azóta történt

Előzmények