_nec - webfejlesztés, front-end programozás, javascript, css, xhtml, ajax, air

Adobe AIR #6 SQLite JavaScriptből

Szünet után folytatva az Adobe AIR-ről szóló sorozatom, most az AIR beépített SQL adazbázis kezelését igyekszem bemutatni. Pár példával letudjuk az alapvető, az SQL lekérdező nyelvben ismert műveletet, majd kitérek pár optimalizációs megoldásra.

Az AIR futtatókörnyezet tartalmaz egy SQLite adatbázis kezelő osztálycsomagot, melyet nyugodtan használhatunk adatok tárolására, kezelésére és szinkonizálására.  Annak, aki nem ismeri, erről az adatbázis rendszerről talán a legfontosabb amit érdemes nagy vonalakban elmondani, az az, hogy komplex file és memória struktúrák helyett egyetlen bináris file-ban tárolja az adatbázist. Mivel egy file és bináris, ezt a filet hordozhatjuk bármilyen rendszerre, ahol szintén használható, már ha létezik az adott rendszerre SQLite verzió.

Ennek köszönhető, hogy már rengeteg alkalmazás és operációs rendszer él ezzel a minimalista, de rendes relációs adatbázisrendszerrel, mint pl a Skype vagy a Firefox illetve a Mac OSX, jópár Symbian alapú mobiltelefon és minden iPhone vagy iPod Touch.

AIRben az adatbázishoz JavaScript segítségével férünk hozzá, mely elsőre szürreális élmény lehet azoknak, akik eddig csak rendes szerveroldali nyelvekben tettek hasonlókat.

Szinkron – aszinkron műveletek

Mint JS-ben rengeteg minden, az adatbázis műveleteink is lehetnek szinkron folyamatok, illetve eseményfüggők, így aszinkron lefutású kódok. Mindkettőnek van előnye ill. hátránya, a szinkron műveletek kódolás szempontjából egyszerűbbek, nem kell eseménykezelőkkel babrálni, de amíg lefut, a programunk malmozik/homokórázik használhatatlan csendben. Nem is ajánlott, csak nagyon kicsi adatbázisokkal, kevés adattal használni.

Az aszinkron műveletekre már készülni kell a kódunkban, eseményeket kell elkapni, adatokat mozgatni, de cserébe folyamatos marad a felhasználói élmény, meg valahogy ez közelebb is áll ahhoz a fejlesztési stílushoz, amit manapság az AJAX-al teletűzdelt weboldalak, alkalmazások megkívánnak tőlünk.

Csatlakozás az adatbázishoz

Lássuk az elejét, vegye elő alkalmazásunk az adatbázist.

1
2
3
var dbFile = new air.File("app:/db/database.db");
var db = new air.SQLConnection();
db.open(dbFile);

Meghatározunk egy File pointert ami az SQLite adatbázis filera mutat, az app:/ relatív elérési útvonal az alkalmazásunk telepített helye a fájlrendszeren. Majd létrehozzuk a kapcsolatot az adatbázishoz és megnyitjuk azt, SQLite esetén ez az a file amit megadunk neki, egy file – egy adatbázis.

Létrehozunk egy SQLConnection objektumot, majd megnyitjuk vele az adatbázist. Az SQLConnection-nek van sok eseménye, amit érdemes figyelni, leginkább talán az air.SQLErrorEvent.ERROR -t, ha hiba van. Az adatbázis megnyitása történhet az open metódussal, ha szinkron, és az openAsync metódussal, ha aszinkron műveletekkel szeretnénk dolgozni.

Aszinkron műveletek során minden lefuttatott kérést figyeltetni kell majd egy air.SQLEvent.RESULT eseményre, de most időhiányában nem térek ki az aszinkron műveletekre.

SQL műveletek

Miután alkalmazásunk csatlakozott az adatbázishoz, az SQL műveletek nagy része már nem sokban különbözik a más nyelvekben megszokott módoktól. Létrehozunk egy SQLStatement objektumot, megadjuk neki melyik adatbázist használja, és hogy mi a művelet.

4
5
6
var statement = new air.SQLStatement(); 
statement.sqlConnection = db; // az adatbázis
statement.text = "SELECT name, value FROM options"; // a művelet
7
8
9
10
11
12
13
14
15
statement.execute(); 
var results = statement.getResult(); // eredmények kiolvasása az SQLStatement objektumból
var numResults = results.data.length; 
for (i = 0; i < numResults; i++) 
{
    var row = result.data[i];
    row.name; // a mezőértékek asszociatív tömbben
    row.value;
}

Aszinkron műveletek során egy air.SQLEvent.RESULT eseményt kell figyeltetni az SQLStatement objektumon, de az eseménykezelőben a kód már ugyanez.
 
INSERT, UPDATE és DELETE műveleteknél nincs különbség, ha a statement.execute(); lefut, illetve van
air.SQLEvent.RESULT esemény, akkor volt sikeres a művelet.

Hibakezelés

Aszinkron műveleteknél az air.SQLErrorEvent.ERROR esemény figyelésekor kapott esemény-objektum hordozza a hibaüzenetet, szinkron műveletek esetén használjuk a try-catch szerkezetet, az elkapott kivétel tartalmazza majd a hiba okát.

Tippek, optimalizálás

AUTOINCREMENT - ilyen típusu oszlopoknál INSERT után az eredményobjektum lastInsertRowID paramétere hordozza az új ID-t

Paraméterezett műveletek – az AIR minden SQL műveletet alacsonyabb szintű műveleti kódra fordít, és úgy tárol, amíg nem változik a művelet szerkezete. Sok, hasonló szerkezetű művelet esetén ezt érdemes kihasználni a művelet paraméterezésével.

Ilyenkor az SQL művelet kódját felkészítjük változók fogadására, s azokat később adhatjuk hozzá vagy módosíthatjuk ahelyett, hogy újraírnánk vagy újra példányosítanánk egy SQLStatement objektumot.

17
18
19
20
statement.text = "INSERT INTO options(name, value)" + 
                 "VALUES (:optionName, :optionValue)"; 
statement.parameters[":optionName"] = "title";
statement.parameters[":optionValue"] = "Adobe AIR #6 SQLite JavaScriptből";

Később, ha ugyanerre a műveletere van szükség, csak a már példányosított SQLStatement objektumot kell újra elővenni, és módosítani a paramétereket az execute() előtt. Ennek a módszernek előnye az erőforrás kímélésen és a műveletek gyorsaságán kívül az, hogy védelmet nyújt az esetleges sql-injection sebezhetőségek ellen.

Tranzakciók – sok, logikailag valamilyen szinten összetartozó műveletet (írás/olvasás) érdemes egy tranzakcióba helyezni, összességében gyorsabb lesz a művelet.

Tranzakciókat az air.SQLConnection.begin().commit() – illetve .rollback() metódusaival tudunk kezelni.

Előre csomagolt adatbázisok, külső segédeszközök

Természetesen nem kell minden adatbázist helyben elkészíteni és kezdeti adatokkal, struktúrával feltölteni, lehetséges előre csomagolni az adatbázis állományt a letöltött AIR csomaggal. Csak ügyeljünk arra, hogy updatek esetén ne legyen gond esetleges felülírásból.

Az adatbázis kezeléséhez érdemes valami SQLmanager programot szerezni, vannak kifejezetten SQLitehoz kiadott programok, illetve AIRben is írtak már ilyen eszközt.

Nekem az SQLite Maestro nevű vállt be, igaz csak 30napos verziót néztem, de egész használhatónak bizonyult.

Eddig az Adobe AIR-ről:

cimkék:

Hozzászólások, trackbackek [trackback url]

  1. Benkő Nóra 13:54 | 2008.10.28

    Ajánlom figyelmedbe a http://www.jazzrecord.org/ oldalt. Egy normális jól használható wrappert ad a Gears és AIR fejlesztők kezébe.

  2. _nec 19:09 | 2008.10.28

    Ez valoban jonak igerkezik, koszi! Hasznaltad mar valahol elesben?

  3. Benkő Nóra 20:54 | 2008.10.28

    Áh, olyan bátor nem vagyok. :-) Még csak a 0.1b verziónál tart, és van pár hiányossága.

    Provide models with behavior (coming soon!)
    Vagy a migrations.

    De az biztos, hogy hányok az AIR és a Gears SQL kezelésétől. Minden, csak nem develfriendly. :-)

  4. Akron 16:33 | 2008.10.30

    Az air alkalmazásokat valamennyire lehet védeni, hogy ne piszkálhasson csak úgy bele a kedves user? Pl. a html es js fileokat egyetlen kódolt csomagba elhelyezni, vagy bármi… :)

  5. Benkő Nóra 10:11 | 2008.10.31

    A JS és CSS fájlokat össze tudod kuszálni, és akkor ember nem lesz a talpán, aki nekiáll azokat visszaalakítani. A HTML-nél nincs ilyen lehetőség.

  6. _nec 11:37 | 2008.10.31

    Nora, ez esetleg nem erdekel? :)

  7. Bolla Sandor 12:10 | 2008.10.31

    @Akron: at lehet alakitani az air alkalmazasokat exe-re vagy dmg-re hogy vedjed a kododat valamennire: http://www.shu-player.com/, esetleg keress ra air 2 exe -re googliban

    -cs-
    Sanyi

  8. _nec 12:37 | 2008.10.31

    Egyre jobban alakul az AIR dolga, ezzel a SHU-val is pl. Ki is probalom…

  9. Benkő Nóra 16:17 | 2008.10.31

    _nec, áh köszi, én nem vagyok programozó, csak hobbiból ügyködöm néha. Egészen más területem dolgozom. :)

    Sanyi, kösz a tippet, nem rossz stuff, egyetlen _komoly_ hátránya, hogy linuxos standalone buildet nem képes készíteni.

  10. _nec 16:20 | 2008.10.31

    Nora, sebaj, en is igy kezdtem :)

  11. Bolla Sandor 22:52 | 2008.11.02

    En egyenlore nem tartom meg tulsagosan biztonsagosnak, amig nem lehet megvedeni a programodat valamilyen modon. Hiaba irtam az adobenak, nem valaszoltak meg a mai napig sem…

    -cs-

  12. Bolla Sandor 14:08 | 2008.11.03

    bocs a sok kulonallo hozzaszolasert, csak alig voltam gepkozelben, szerintem erosen el kellene gondolkozni a flashban valo munkan. Azt jobban meg tudod vedeni es hasonlo programozasi nyelvet hasznal ActionScript AS3. Persze kicsit mas mint a HTML + JavaScript, de szerintem ha AIR-ben gondolkodtok, akkor a Flash az talan meg jobb baratod is lehet :)

    -cs-

    UI: Adobe FLEX (free SDK es builder), nem reklam :)

  13. Nick Carter 15:47 | 2008.11.09

    Hello, I don’t speak Hungarian but came across this blog in trying to follow what folks are saying about JazzRecord.

    I wanted to let anyone who was interested know that JazzRecord now has working validation. Model and Record methods are also working great in the latest builds and will soon be documented on the site.

    We hope to have migrations be done shortly as well, hopefully before the end of the year.

  14. Benkő Nóra 19:11 | 2008.12.09

    Hello Nick,

    Sorry for slow respond. I wrote JazzRecord above, but I’ve never used. It is in early beta status and I not suggest to use in production environment (IMHO).

    But if you would like to use (and the end of year is not too far) I like to read your feedback and experience.

    Regards,
    Nora

  15. Nick Carter 13:31 | 2008.12.15

    Hi Nora, I’m actually the main author of JazzRecord. It’s really coming along and the current builds on GitHub are very stable and have significant new features. (Autolinking/unlinking being the most prominent)

    Migrations may end up going into the library early in 2009, as I’m in the process of removing the dependency on MooTools and adding further testing right now.

    I agree it should not be used in production just yet, but any project using it may help us make significant strides toward production-readiness!

  16. Benkő Nóra 19:27 | 2008.12.16

    Hi Nick,

    Oh I’m sorry, I didn’t know you are the main developer. I plan to use JazzRecord (new features are very cool).

    Have you ever heard about Titanium Appcelerator? http://titaniumapp.com/ It would be great if JR has support it in future. :)

    I’m an open source fanatics, Adobe AIR’s licence is too strict for me to build production apps.

    Thanks your great work, I promote JR on Hungarian webdevel forums!

    Regards,
    Nora

  17. Benkő Nóra 14:15 | 2009.01.14

    Újabb trónkövetelő a fejlesztőbarát SQL eléréshez JS alól.

    ActiveRecord.js

    http://www.aptana.com/blog/rjohnson/activerecord_js_released_as_beta

    Kompatibilis Gears-szel, AIR-rel, HTML5-tel stb.

    Nick, please check it url above.

  18. Nick Carter 10:38 | 2009.03.26

    Sorry for the late reply. I’ve still not tried out ActiveRecord.js but I do think it’s excellent Aptana is interested in promoting such tools.

    JazzRecord has different syntax and features, and I encourage folks to try out both libraries and see which they like better.

    I don’t believe ActiveRecord.js actually supports HTML5 yet, as is stated on their site. Both libraries will have support for HTML5/asynchronous in the future, hopefully within the next month for JazzRecord.

    Async/HTML5 will open up the door to usage in Titanium since PR2 (we supported PR1 and it used Gears) as well as Palm webOS and future WebKit-based environments.

    Thanks again for the interest, and please contact us via Google Group (http://groups.google.com/group/jazzrecord) if you need help!

Szólj hozzá







kategóriák


del.icio.us

  • No bookmarks avaliable.

epp olvasom

  • A Clash of Kings

    A Clash of Kings by George R.R. Martin

flickr

  • Tuomas Holopainen - the Imagineer
  • The Flock
  • Christmas Crow
  • Geek joy
  • Fast Food - extreme edition
  • Teide north side
  • Teide National Park
  • Genesis
  • Rado Cerix
  • werk - _nec
  • werk - Strati

back to index