<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>_nec &#187; sqlite</title>
	<atom:link href="http://nec.shell8.net/tag/sqlite/feed/" rel="self" type="application/rss+xml" />
	<link>http://nec.shell8.net</link>
	<description>webfejlesztés, front-end programozás, javascript, css, xhtml, ajax, air</description>
	<lastBuildDate>Wed, 31 Aug 2011 06:54:12 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Adobe AIR #6 SQLite JavaScriptből</title>
		<link>http://nec.shell8.net/2008/10/22/adobe-air-sqlite-javascript/</link>
		<comments>http://nec.shell8.net/2008/10/22/adobe-air-sqlite-javascript/#comments</comments>
		<pubDate>Wed, 22 Oct 2008 15:17:17 +0000</pubDate>
		<dc:creator>_nec</dc:creator>
				<category><![CDATA[JS]]></category>
		<category><![CDATA[adobe]]></category>
		<category><![CDATA[air]]></category>
		<category><![CDATA[js]]></category>
		<category><![CDATA[sql]]></category>
		<category><![CDATA[sqlite]]></category>

		<guid isPermaLink="false">http://nec.shell8.net/?p=20</guid>
		<description><![CDATA[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 [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://nec.shell8.net/wp-content/uploads/2008/10/sqlite.gif"><img src="http://nec.shell8.net/wp-content/uploads/2008/10/sqlite.gif" alt="" title="SQLite logo" width="105" height="105" class="alignleft size-full wp-image-193" /></a>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.</p>
<p><span id="more-20"></span></p>
<p>Az AIR futtatókörnyezet tartalmaz egy <a href="http://www.sqlite.org/">SQLite</a> 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ó.</p>
<p>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.</p>
<p>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 <em>rendes </em>szerveroldali nyelvekben tettek hasonlókat.</p>
<h3>Szinkron &#8211; aszinkron műveletek</h3>
<p>Mint JS-ben rengeteg minden, az adatbázis műveleteink is lehetnek <strong>szinkron </strong>folyamatok, illetve eseményfüggők, így <strong>aszinkron </strong>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.</p>
<p>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.</p>
<h3>Csatlakozás az adatbázishoz</h3>
<p>Lássuk az elejét, vegye elő alkalmazásunk az adatbázist.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> dbFile <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> air.<span style="color: #660066;">File</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;app:/db/database.db&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #003366; font-weight: bold;">var</span> db <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> air.<span style="color: #660066;">SQLConnection</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
db.<span style="color: #000066;">open</span><span style="color: #009900;">&#40;</span>dbFile<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>Meghatározunk egy File pointert ami az SQLite adatbázis filera mutat, az <em>app:/</em> 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 &#8211; egy adatbázis.</p>
<p>Létrehozunk egy <em>SQLConnection </em>objektumot, majd megnyitjuk vele az adatbázist. Az <a href="http://help.adobe.com/en_US/AIR/1.1/jslr/flash/data/SQLConnection.html">SQLConnection</a>-nek van sok eseménye, amit érdemes figyelni, leginkább talán az <em>air.SQLErrorEvent.ERROR</em> -t, ha hiba van. Az adatbázis megnyitása történhet az <em>open </em>metódussal, ha szinkron, és az <em>openAsync </em>metódussal, ha aszinkron műveletekkel szeretnénk dolgozni.</p>
<p>Aszinkron műveletek során minden lefuttatott kérést figyeltetni kell majd egy a<em>ir.SQLEvent.RESULT</em> eseményre, de most időhiányában nem térek ki az aszinkron műveletekre.</p>
<h3>SQL műveletek</h3>
<p>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 <em>SQLStatement </em>objektumot, megadjuk neki melyik adatbázist használja, és hogy mi a művelet.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>4
5
6
</pre></td><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> statement <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> air.<span style="color: #660066;">SQLStatement</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> 
statement.<span style="color: #660066;">sqlConnection</span> <span style="color: #339933;">=</span> db<span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// az adatbázis</span>
statement.<span style="color: #660066;">text</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;SELECT name, value FROM options&quot;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// a művelet</span></pre></td></tr></table></div>


<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>7
8
9
10
11
12
13
14
15
</pre></td><td class="code"><pre class="javascript" style="font-family:monospace;">statement.<span style="color: #660066;">execute</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> 
<span style="color: #003366; font-weight: bold;">var</span> results <span style="color: #339933;">=</span> statement.<span style="color: #660066;">getResult</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// eredmények kiolvasása az SQLStatement objektumból</span>
<span style="color: #003366; font-weight: bold;">var</span> numResults <span style="color: #339933;">=</span> results.<span style="color: #660066;">data</span>.<span style="color: #660066;">length</span><span style="color: #339933;">;</span> 
<span style="color: #000066; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span>i <span style="color: #339933;">=</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> numResults<span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> 
<span style="color: #009900;">&#123;</span>
    <span style="color: #003366; font-weight: bold;">var</span> row <span style="color: #339933;">=</span> result.<span style="color: #660066;">data</span><span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
    row.<span style="color: #000066;">name</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// a mezőértékek asszociatív tömbben</span>
    row.<span style="color: #660066;">value</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Aszinkron műveletek során egy <em>air.SQLEvent.RESULT</em> eseményt kell figyeltetni az <em>SQLStatement </em>objektumon, de az eseménykezelőben a kód már ugyanez.<br />
 <br />
INSERT, UPDATE és DELETE műveleteknél nincs különbség, ha a statement.execute(); lefut, illetve van<br />
<em>air.SQLEvent.RESULT</em> esemény, akkor volt sikeres a művelet.</p>
<h3>Hibakezelés</h3>
<p>Aszinkron műveleteknél az <em>air.SQLErrorEvent.ERROR</em> esemény figyelésekor kapott esemény-objektum hordozza a hibaüzenetet, szinkron műveletek esetén használjuk a <em>try-catch</em> szerkezetet, az elkapott kivétel tartalmazza majd a hiba okát.</p>
<h3>Tippek, optimalizálás</h3>
<p><strong>AUTOINCREMENT </strong>- ilyen típusu oszlopoknál INSERT után az eredményobjektum <em>lastInsertRowID </em>paramétere hordozza az új ID-t</p>
<p><strong>Paraméterezett műveletek</strong> &#8211; 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.</p>
<p>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 <em>SQLStatement </em>objektumot.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>17
18
19
20
</pre></td><td class="code"><pre class="javascript" style="font-family:monospace;">statement.<span style="color: #660066;">text</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;INSERT INTO options(name, value)&quot;</span> <span style="color: #339933;">+</span> 
                 <span style="color: #3366CC;">&quot;VALUES (:optionName, :optionValue)&quot;</span><span style="color: #339933;">;</span> 
statement.<span style="color: #660066;">parameters</span><span style="color: #009900;">&#91;</span><span style="color: #3366CC;">&quot;:optionName&quot;</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;title&quot;</span><span style="color: #339933;">;</span>
statement.<span style="color: #660066;">parameters</span><span style="color: #009900;">&#91;</span><span style="color: #3366CC;">&quot;:optionValue&quot;</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;Adobe AIR #6 SQLite JavaScriptből&quot;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>Később, ha ugyanerre a műveletere van szükség, csak a már példányosított <em>SQLStatement </em>objektumot kell újra elővenni, és módosítani a paramétereket az <em>execute()</em> 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.</p>
<p><strong>Tranzakciók</strong> &#8211; sok, logikailag valamilyen szinten összetartozó műveletet (írás/olvasás) érdemes egy tranzakcióba helyezni, összességében gyorsabb lesz a művelet.</p>
<p>Tranzakciókat az <a href="http://help.adobe.com/en_US/AIR/1.1/jslr/flash/data/SQLConnection.html#begin()">air.SQLConnection.begin()</a> &#8211; <a href="http://help.adobe.com/en_US/AIR/1.1/jslr/flash/data/SQLConnection.html#commit()">.commit()</a> &#8211; illetve <a href="http://help.adobe.com/en_US/AIR/1.1/jslr/flash/data/SQLConnection.html#rollback()">.rollback()</a> metódusaival tudunk kezelni.</p>
<h3>Előre csomagolt adatbázisok, külső segédeszközök</h3>
<p>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.</p>
<p>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.</p>
<p>Nekem az <a href="http://www.sqlmaestro.com/products/sqlite/maestro/">SQLite Maestro</a> nevű vállt be, igaz csak 30napos verziót néztem, de egész használhatónak bizonyult. </p>
<p><strong>Eddig az Adobe AIR-ről:</strong></p>
<ul>
<li><a href=" http://nec.shell8.net/2008/10/14/eval-adobe-air-ben/">Eval(); Adobe AIR-ben</a></li>
<li><a href="http://nec.shell8.net/2008/07/11/adobe-air-nativ-menukezeles/">#5 Natív menükezelés</a></li>
<li><a href="http://nec.shell8.net/2008/07/05/adobe-air-dragndrop-filefeltoltes/">#4 Drag’n&#8217;Drop és Filefeltöltés</a></li>
<li><a href="http://nec.shell8.net/2008/06/25/adobe-air-esemenyek">#3 Események</a></li>
<li><a href="http://nec.shell8.net/2008/06/23/adobe-air-ablakkezeles">#2 Ablakkezelés</a></li>
<li><a href="http://nec.shell8.net/2008/06/19/adobe-air-alapok">#1 Az alapok</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://nec.shell8.net/2008/10/22/adobe-air-sqlite-javascript/feed/</wfw:commentRss>
		<slash:comments>18</slash:comments>
		</item>
	</channel>
</rss>

