Hirdetés

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

Bevezető

Ha egy olyan alkalmazást fejlesztünk, amelyben adatokat szeretnénk tárolni, a legcélszerűbb ezt adatbázissal megoldani. Badán sincs ez másképp, bár az adatbázismotor megválasztására a lehetőségeink elég limitáltak. Gyakorlailag csak a beépített SQLite-ot használhatjuk, amit az Osp::UI névtér alól érhetünk el.

Az SQLite-ról röviden

Maga az SQLite egy alig fél megás függvénykönyvtár, mely a szabványos kliens-szerver adatbáziskeezlőkkel ellentétben nem egy külön folyamat, hanem az alkalmazás része (azaz nem fut párhuzamosan egy adatbázis-szerver és egy kliensprogram, hanem maga az app valósítja meg mindkét oldalt). Ez beágyazott rendszerek esetén hasznos tulajdonság, nem kell foglalkozni a folyamatok közötti kommunikációval, ezzel nem kis overheadtől szabadítva meg a rendszert. Maga a library nyílt forráskódú, egy D. Richard Hipp nevű úriember írta azzal a céllal, hogy a szoftver előzetes telepítés és konfigurálás nélkül képes legyen adatbázist kezelni. Szokatlan típuskezelést használ: míg egy “szabványos” adatbáziskezelőnél az oszlopokhoz rendeljük a típusokat, itt az értékekhez (dynamically typed). Továbbá gyengén típusos, azaz egy integer oszlop mezőjébe beszúrhatunk stringet is (persze ekkor megpróbálja átkonvertálni), ez hasonló a Perl/PHP típuskezeléséhez (fúj!). Maga a könyvtár nagyon sok programnyelvben használható, valamint okostelefonokon is közkedvelt (a bada mellett az iPhone és a Symbian is használja). Programozni standard SQL nyelven lehet (mint a neve is mutatja).

A badás működés illusztrálására írtam egy példaprogramot, amiben egy nagyon egyszerű táblába szúrhatunk be elemeket. Ezeket az elemeket egy listában (Osp::Ui::Controls::List) jelenítem meg. Nézzük, hogyan is épül fel az egész!

Mutasd meg a kódod, megmondom ki vagy!

Létrehoztam egy külön osztályt, ami csak az adatbáziskezelést valósítja meg, a neve a fantáziadús DataBaseHandler. Az osztály a two-phase konstruktor paradigma szerint van megírva, a konstruktor után még meg kell hívni a Construct() függvényt. Ha C++-t használunk, elég sok esetben rengeteg glue code-ot kell írnunk, ami nem közvetlenül a problémánk megoldásához kell, de szükséges hozzá. Itt is ez a helyzet, az egész osztály nyüzsög az ilyen snippetektől. Először az adatbázist hozzuk létre, majd a táblát. Mivel ez a kódrészlet is le fog futni minden egyes alkalmazás-indításkor, muszáj customizálnunk egy kicsit, hiszen nem akarjuk, hogy a meglévő táblát minden indításkor újra létrehozzuk (ez hibához is vezetne). Ezt lehetőségünk van leellenőrizni a Database.exist() függvénnyel, azonban elegánsabb, ha az alap CREATE TABLE parancsot kibővítjük a következőre: CREATE TABLE IF NOT EXISTS. Ez ugyanazt csinálja, egy sor kóddal kevesebbért. Megvagyunk az init résszel, jöhetnek a függvények. Ugyebár egy CRUD-képes alkalmazást írunk (Create-Read-Update-Delete), ezért négy függvényünk lesz. Az algoritmus a beszúrás, módosítás és törlés esetén ugyanaz, ezek csak az SQL parancsokban különböznek. Először megírjuk az SQL lekérdezést, ebből létrehozzuk a statement-et (ez az az osztály, ami az adatbázis-műveleteket kezeli), majd végrehajtatjuk az adatbázison. Ha változót szeretnénk használni a lekérdezésünkben, ezt a query-ben a változó helyére írt kérdőjellel jelezhetjük: INSERT INTO sampletable (name, data) VALUES (?,?). Majd ez után hozzá kell kötni a változónkat a bind függvények segítségével és végrehajtani a query-t, ez egy enumerator-t ad vissza. Ezzel a módszerrel túlvagyunk a Persist(), Delete() és Update() függvényeken.

Ahhoz, hogy a listát telepakoljuk az adatainkkal, le kell kérdeznünk az összes sort. Itt jön képbe a fentebb említett enumerator, ami SELECT típusú lekérdezés esetén egy listát ad vissza. Ezt az ( iterátorhoz hasonló) eredményhalmazt a Next() függvény hívogatásával tudjuk bebarangolni (nyilván minden függvényhívásra a halmaz egy sorát kapjuk). Ezt adjuk át a lista populálását végző függvénynek, ami minden művelet után lefut, befrissítve ezzel az osztályt.

A formot a beépített UI builderrel készítettem, egy List és egy Button elemet tartalmaz. A példakód ismét letölthető, ebben a verzióban még csak a hozzáadás működik, a következő bejegyzésben hozzákötjük a további műveleteket a listához.

holdmester

Azóta történt

Előzmények