Sunteți pe pagina 1din 51

SQLite SQLite este o mic bibliotec C care implementeaz un motor de baze de date SQL ncapsulat, ofer posibilitatea de a-l

introduce n diverse sisteme i necesit zero-configurare. Cuprins [ascunde] 1 Ce este SQLite? 2 ntrebuinrile SQLite o 2.1 Situaii n care SQLite merge bine o 2.2 Situaii n care alt RDBMS ar merge mai bine 3 Caracteristicile SQLite 4 SQLite n 5 minute 5 Versiunea 3.0 a SQLite 6 Tipuri de date n versiunea 3.0 a SQLite 7 Bibliografie Ce este SQLite?[modificare] SQLite este o mic bibliotec C care implementeaz un motor de baze de date SQL ncapsulat, ofer posibilitatea de a-l introduce n diverse sisteme i necesit zero-configurare. Caracteristicile includ: Tranzaciile sunt atomice, consistente, izolate i durabile (ACID) chiar dup cderi de sistem i pene de current. Zero-configurare - nici o setare sau administrare necesar. Implementeaz o mare parte a SQL92. (sunt unele caracteristici nesuportate) O baz de date ntreag este stocat ntr-un singur fiier de pe HDD. Fiierele baz de date pot fi liber partajate ntre maini cu ordine diferit de octei. Suport baze de date de pn la 2 terraoctei (2 ^ 41 octei) n mrime. Mrimea irurilor i BLOB-urile limitate doar de memoria disponibil. Cod de baz mic: mai puin de 250KiO configurat complet sau mai puin de 150KiO cu caracteristici opionale omise. Mai rapid dect baze de date client/server cunoscute pentru majoritatea operaiilor obinuite. API simplu, uor de folosit. Legturi TCL incluse. Legturi ctre alte multe limbaje disponibile separat. Cod surs foarte bine comentat cu peste 95% acoperire prin teste. ncapsulat: nu are dependene externe. Sursele sunt n domeniul public. Poate fi folosit pentru orice scop. Distribuia SQLite vine cu un program linie-comand de sine stttor (sqlite) care poate fi folosit pentru a administra o baz de date SQLite i care servete c un exemplu despre modul n care s folosii librria SQLite. ntrebuinrile SQLite[modificare] SQLite este diferit de majoritatea altor motoare de baze de date SQL prin aceea c a fost proiectat pentru a fi simplu: Simplu de administrat. Simplu de folosit. Simplu de a fi ncapsulat ntr-un program mai mare. Simplu de ntreinut i setat. Multora le place SQLite deoarece este mic i rapid. Dar aceste caliti sunt doar accidente fericite. Utilizatorii descoper, deasemenea, c SQLite este foarte sigur. Sigurana este o consecin a simplismului. Cu mai puin complicare, este mai puin loc de greeli. Deci, da, SQLite este mic, rapid i de ncredere (sigur), dar n primul rnd i cea mai mare calitate a lui este aceea c reuete s fie simplu. Simplitatea ntr-un motor de baze de date poate fi fie un punct tare, fie unul slab, depinde de ceea ce ncerci s faci. Pentru a atinge simplitatea, SQLite a trebuit s sacrifice alte caracteristici care sunt gsite de unii oameni folositoare, ca cea a concurenei nalte, controlul la accesul detaliat, un set bogat de funcii implementate, proceduri stocate, caracteristici ezoterice a limbajului SQL, extensiiXML i/sau Java, scalabilitate tera- sau peta-octet i aa mai departe. Dac ai nevoie de unele din aceste caracteristici i nu i pas de complexitatea adugat pe care o aduc, atunci SQLite nu este probabil baza de date de care ai nevoie. Nu este proiectat s concureze cu Oracle sau cu PostgreSQL.

Regula de baz pentru cnd este potrivit s folosim SQLite este aceasta: folosete SQLite n situaii unde simplitatea n administrare, implementare i ntreinere sunt mai importante dect nenumratele caracteristici complexe pe care motoarele de baze de date enterprise le furnizeaz. Dup cum se dovedete, situaiile unde simplitatea este o alegere mai bun sunt mai des ntlnite dect realizeaz muli oameni. Situaii n care SQLite merge bine[modificare] Situri web SQLite de obicei va merge formidabil ca baz de date pentru trafic al siturilor web mic spre mediu (care este, s spunem, 99.9% din toate siturile). Cantitatea de traffic web pe care SQLite l poate administra depinde, bineneles, de ct de mult folosete situl web baza de date. n general, orice sit care primete mai puin de 100000 de vizite/zi ar trebuii s mearg bine cu SQLite. Cele 100000 de vizite/zi sunt o estimare conservativ, nu o limit maxim. SQLite a fost demonstrat c merge i cu de 10 ori aceast cantitate de trafic. Dispozitive i aplicaii ncapsulate Deoarece o baz de date SQLite necesit puin (sau deloc) administrare, SQLite este o alegere bun pentru dispozitive sau servicii care trebuiesc s mearg neadministrate sau fr sprijin uman. SQLite este potrivit pentru a fi folosit n telefoane mobile, PDA-uri i altele. Ar putea merge bine i ca baz de date ncapsulat n aplicaii consumator descrcabile. Format de fiier la aplicaii SQLite a fost folosit cu succes ca un fiier pe disc sau aplicaii desktop ca de exemplu unealt de analiz financiar, pachete CAD, programe de inut nregistrri i aa mai departe. Operaia tradiional File/Open efectueaz un sqlite3_open() i execut un BEGIN TRANSACTION pentru a obine acces exclusiv la coninut. File/Save face un COMMIT urmat de un alt BEGIN TRANSACTION. Folosirea tranzaciilor garanteaz c update-urile la fiierul aplicaiei sunt atomice, consistente, izolate i durabile (ACID). Declanatoare temporare pot fi adugate bazei de date pentru a nregistra toate schimbrile ntr-o tabela de logare (temporar) Undo/Redo. Aceste schimbri pot fi dup aceea urmrite cnd utilizatorul apasa butoanele Undo i Redo. Folosind aceast tehnic, o implementare pentru un numr de pai nelimitai Undo/Redo poate fi scris n surprinztor de puin cod. nlocuitor pentru fiierele disc ad hoc Multe programe folosesc fopen(), fread() i fwrite() pentru a creea i administra fiiere de date n formate proprii. SQLite merge foarte bine c nlocuitor pentru aceste fiiere de date ad hoc. Baze de date interne sau temporare Pentru programe care au o mulime de date care trebuiesc mutate sau sortate n diverse direcii, este de obicei mai uor i mai rapid s ncarce datele ntr-o baz de date SQLite n-memorie i s folosesca query-uri cu JOIN-uri i clauze ORDER BY pentru a extrage datele n form i ordinea dorit, dect s ncerce codarea acestor operaii manual. Folosind o baz de date SQL intern n acest mod ofer deasemenea programului o flexibilitatea mai mare de cnd coloane noi i indici pot fi adugai fr a recoda fiecare query. Unealt linie-comand pentru analiz dataset-urilor Utilizatorii SQL experimentai pot pune programul linie-comand sqlite pentru a analiza diferite dataset-uri. Date brute pot fi importate din fiiere CSV (Comma Separated Values - Valori Separate prin Virgul), dup acea datele pot fi tiate i aranjate pentru a genera o miriad (un numr foarte mare) de rapoarte scurte. Utilizri posibile includ analiz log-urilor pe un sit, analiz statisticilor sportive, compilarea metricilor programrii i analiza rezultatelor experimentale. Poi, binenteles, s faci acelai lucru cu o baz de date enterprise client/server. Avantajul n folosirea SQLite n aceast situaie este acela c SQLite este mai uor de configurat i baz de date rezultat este un singur fiier pe care l poi stoca pe o dischet, un pen-drive sau un e-mail ctre un coleg. nlocuitor al unei baze de date enterprise n timpul unor demo-uri sau teste Dac scri o aplicaie client pentru un motor de baze de date enterprise, este logic s foloseti o structur de baz de date generic care i permite s te conectezi la multe diferite tipuri de motoare de baze de date SQL. Este i mai logic s faci pasul de a include SQLite n amestecul de baze de date suportate i s legi static motorul SQLite cu clientul. n acest mod programul client poate fi folosit de sine stttor cu un fiier SQLite pentru teste sau pentru demonstraii. Pedagogia bazelor de date

Deoarece este simplu de setat i folosit (instalarea este trivial: doar copiezi SQLite sau executabilul sqlite.exe pe main dorit i l rulezi) SQLite devine un motor de baze de date apt pentru a fi folosit n predarea SQL. Studenii pot uor creea orict de multe baze de date doresc i pot trimite cu ajutorul e-mail-ului aceste baze de date ctre profesor pentru observaii sau pentru notare. Pentru studeni mai avansai care sunt interesai n studiat cum este implementat un RDBMS, codul SQLite foarte bine documentat, comentat i modular poate servi c o baz bun. Nu spunem c SQLite este un model exact a cum sunt implementate alte motoare de baze de date, dar un student care nelege cum funcioneaz SQLite poate mult mai rapid nelege principiile operaionale ale altor sisteme. Extensiile experimentale de limbaj SQL Arhitectur simpl i modular a SQLite face din el o platform bun pentru prototipizarea de idei i caracteristici noi pentru limbajul bazei de date (experimente). Situaii n care alt RDBMS ar merge mai bine[modificare] Aplicaii Client/Server Dac ai multe programe client care acceseaz o baz de date comun peste o reea ar trebuii s consideri folosirea unui motor de baze de date client/server n locul a SQLite. SQLite va merge peste o reea de fiiere sistem, dar din cauza latenei asociat majoritii fisierelor sistem reea, performana nu va fi satisfctoare. De asemenea, implementarea blocrii a multor fisieresitem reea (logic) conine bug-uri (i pe Unix i pe Windows). Dac blocarea fiierului nu merge aa cum ar trebui, este posibil c dou sau mai multe programe client s modifice aceeai parte a aceeai baz de date n acelai moment, rezultnd n o corupere a bazei de date. Deoarece aceast problem rezult din buguri din implementarea ce st la baz fisierelor sistem, nu este nimic ce SQLite ar putea face s previn problema. O bun regul este aceea c ar trebui s evii folositea SQLite n situaii n care aceeas baz de date va fi accesat simultan de mai multe calculatoare ntr-un fiier sistem reea. Situri web cu volum mare SQLite va merge n mod normal bine c baz de date ce sprijin un sit web. ns dac situl web este att de aglomerat nct te gndeti s mpari componena bazei de date pe o main separat, atunci cu siguran ar trebui s iei n considerare folosirea unui motor de baze de date client/server n locul SQLite. Dataset-uri foarte mari Cnd ncepi o tranzacie n SQLite (ceea ce se ntmpl automat nainte de orice operaie de scriere care nu este ntr-un explicit BEGIN...COMMIT) motorul are de alocat un bitmap de pagini murdare n fiierul disc pentru a-l ajut la administrarea jurnalului rollback (de revenire). SQLite necesit 256 de octei de RAM pentru fiecare 1Mo de baz de date. Pentru baze de date mai mici, cantitatea de memorie necesar nu este o problem, dar cnd baz de date ncepe s creasc n rangul muligigaoctei, mrimea bitmapului poate devenii foarte larg. Dac trebuie s depozitezi i s modifici mai mult de cteva duzini de Go de date, atunci ar trebui s te gndeti s foloseti un motor de baze de date diferit. Concuren SQLite folosete lacte reader/writer pe ntregul de date. Orice proces citete din orice parte bazei de date, toate celelalte procese sunt oprite din orice punct a bazei de date. Similar, oricnd un proces scrie date, toate celelalte procese sunt oprite din citit orice parte a bazei de date. Pentru multe situaii nu este o problem. Fiecare aplicaie face propria operaie peste de date lucreaza rapid i trece mai departe, nici o nchidere nu dureaz mult de cteva milisecunde. Sunt unele aplicaii, ns, care necesit mai mult concuren, i acele aplicaii ar avea nevoie de abordri diferite. Caracteristicile SQLite[modificare] Aratm n continuare unele din caracteristicile SQLite-ului care sunt neobinuite i care fac SQLite diferit de multe alte motoare de baze de date SQL: Zero-Configurare SQLite nu are nevoie de "instalare" nainte de a fi folosit. Nu exist procedura de "setup". Nu exist nici un proces server care necesit pornire, oprire sau configurare. Nu este nevoie de un administrator pentru a creea o nou instan de baz de date sau pentru a atribui permisiuni de acces utilizatorilor. SQLite nu folosete fiiere de configurare. Nu trebuie fcut nimic pentru a ateniona sistemul c SQLite ruleaz. Nici o aciune nu este necesar pentru a recupera ceva dup o cdere de sistem sau dup o pan de curent. Nu este nimic de rezolvat. SQLite merge.

Alte motoare de baze de date cunoscute ruleaz formidabil odat ce le-ai pus pe picioare, ns instalarea iniial i configurarea poate fi intimidant de complex. Fr server Majoritatea motoarelor de baze de date SQL sunt implementate c un proces server separat. Programe care doresc acces la baz de date comunic cu serverul folosind un fel de comunicare interprocese (tipic TCP/IP) pentru a trimite cereri ctre server i s primeasc napoi rezultate. SQLite nu lucreaz aa. Cu SQLite, procesul ce dorete s acceseze baz de date citete i scrie direct din fiierele baz de date de pe disc. Nu exist nici un proces server intermediar. Sunt avantaje i dezavantaje n a lucra fr server. Marele avantaj este acela c nu exist un proces server de instalat, setat, configurat, iniializat, administrat i reparat. Acesta este unul din motivele pentru care SQLite este un motor de baze de date "zero-configurare". Programe care folosesc SQLite nu necesit suport administarativ pentru a pregti motorul de baze de date nainte c acesta s fie rulat. Orice program care este capabil s acceseze discul este capabil s foloseasc o baz de date SQLite. Pe de alt parte, un motor de baze de date care folosete un server poate oferi o protecie mbuntit n aplicaii client - pointeri rtcii n un client nu pot corupe memoria pe server. i deoarece un server este un proces unic persistent, el este capabil s controleze accesul la baz de date cu o mai mare precizie, permind o blocare rafinat i concuren mbuntit. Majoritatea bazelor de date SQL sunt bazate pe modelul client/server. Din cele care sunt fr server, SQLite este singur care este tiut, de autor, c permite mai multor aplicaii s acceseze aceeai baz de date n acelai timp. Un singur fiier baz de date O baz de date SQLite este un singur fiier disc (ordinar) care poate fi plasat (localizat) oriunde n ierarhia directoarelor. Dac SQLite poate citi fiierul disc atunci poate citi orice din baz de date. Dac fiierul disc i directorul su sunt writeable (permit scrierea n ele), atunci SQLite poate schimb orice n baz de date. Fiierele baz de date pot fi uor copiate pe memory stick-uri USB sau trimise prin e-mail pentru a partajare. Alte motoare de baze de date SQL tind s stocheze date c o mare colecie de fiiere. Des aceste fiiere sunt n o locaie standard pe care numai motorul de baze de date nsi le poate accesa. Aceast face datele mai sigure, dar ns face mai greoi i accesul. Unele motoare de baze de date SQL ofer opiunea de a scrie direct pe disc i trecerea, astfel, de fisierul sistem. Aceast da performan, dar pentru costul unui setup considerabil i complexitate de administrare. Compact Cnd este optimizat pentru mrime, inreaga librrie SQLite cu toate opiunile activate este mai mic de 225KiO (dup msurarea pe un ix86 folosind utilitarul "size" de pe pachetul compliator GNU). Opiunile nenecesare pot fi dezactivate n timpul compilarii pentru a reduce mai mult mrimea librrii pn sub 170KiO (dac se dorete). Majoritatea altor motoare de baze de date SQL sunt mult mai mari dect att. IBM se luda c motorul de baze de date recent lansat CloudScape are "numai" un fiier jar de 2MiB - de 10 ori mai mare dect SQLite chiar i dup ce este compresat! Firebird se luda c, partea lui client are doar 350KiO. Asta este cu 50% mai mare dect SQLite i nici mcar nu conine motorul de baze de date. Librria DB Berkeley este la Sleepycat este de 450KiO i omite suport SQL, oferindu-i programatorului doar simple perechi cheie/valoare. Alocarea tipului de date evident Majoritatea motoarelor de baze de date SQL folosesc atribuire static a tipului de date. Un tip de data este asociat cu fiecare coloan dintr-un tablou i doar valorilor a acelui tip de date particular le este permis s fie stocate n acea coloan. SQLite relaxeaz aceast restricie folosind modul de atribuire a tipului de date evident. n acest mod, tipul de date este o proprietate a valorii nsi, nu a coloanei n care valoarea este stocat. SQLite, astfel, permite utilizatorului s stocheze orice valoare de orice tip n orice coloan necontnd tipul declarat al acelei coloane. (Sunt nite excepii de la aceast regul: O coloan INTEGER PRIMARY KEY poate stoca doar ntregi. SQLite ncearc s convearteasca valorile n tipul de date declarat a coloanei cnd poate.) Specificaiile limbajului SQL cer alocarea static a tipului de date. De aceea uni oameni spun c folosirea modului de alocare a tipului de date evident este un bug n SQLite. Autorii SQLite, pe de

alt parte, in s cread c aceast este o caracteristic. Autorii spun c alocarea static este un bug n specificaiile SQL pe care SQLite l-a reparat ntr-un mod care este compatibil napoi. nregistrri de lungime variabil Majoritatea altor motoare de baze de date SQL aloc o cantitate fix de spaiu de disc pentru fiecare linie n majoritatea tabelelor. Ele utilizeaz tehnici speciale pentru manevrarea BLOB-urilor i CLOB-urilor care pot fi de o dimensiune foarte variat. Pentru majoritatea tabelelor, ns, dac declari o coloanasa fie VARCHAR(100) atunci motorul de baze de date va aloca 100 de octei spaiu pe disc indiferent de ct de mult informaie stochezi n acea coloan. SQLite, n contrast, folosete numai cantitatea de spaiu pe disc necesar s stocheze informaia n o linie. Dac stochezi un singur caracter n o coloan VARCHAR(100), atunci un singur octet de spaiu pe disc este folosit (de fapt doi octei - este un overhead la nceputul fiecrei coloane pentru a-i nregistra tipul de date i lungimea). Folosirea nregistrrilor de lungime variabila are un numr de avantaje. Se concretizeaz, evident, n fiiere baz de date mai mici. De asemenea face bazele de date s ruleze mai rapid, de vreme ce este mai puin informaie s fie micat de pe i pe disc. i, aceast metod face posibil lui SQLite s foloseasc atribuirea tipului de date evident n locul metodei de alocare static. Cod surs lizibil Codul surs a SQLite este proiectat pentru a fi lizibil i accesibil unui programator mediu. Toate procedurile i structurile de date i multe variabile automate sunt comentate cu grij cu informaii utile despre ceea ce fac. Comentariile elevate sunt omise. Declaraiile SQL compileaz n cod main virtual Orice motor de baze de date SQL compileaz fiecare declaraie SQL ntr-un fel de structur de date intern care este dup aceea folosit pentru a indeplini sarcin declaraiei. Dar, n majoritatea motoarelor SQL acea structur de date intern este o reea complex de structuri interconectate i obiecte. n SQLite, form compilat a declaraiilor este un program scurt n un limbaj-main c reprezentare. Utilizatorii bazei de date pot s vad acest limbaj main virtual prin adugarea la sfritul unui query a keyword-ului (cuvntul rezervat) EXPLAIN. Folosirea unei maini virtuale n SQLite a fost de un mare folos dezvoltrii librriei. Main virtual ofer o crisp, o bine definit uniune ntre front-end-ul SQLite (partea care parseaz declaraiile SQL i genereaz cod main virtual) i back-end-ul acestuia (partea care execut codul virtual main i calculeaz un rezultat). Main virtual permite dezvoltatorilor s vad clar i n o manier uor de citit ceea ce SQLite ncearc s fac cu fiecare declaraie pe care o compileaz, care este de un ajutor de neimaginat n debugging. Depinznd de cum este compilat, SQLite deasemenea are capacitatea de a urmrii execuia codului main virtual - printand fiecare din instruciunile mainii virtuale i rezultatele lor n timpul execuiei. Domeniul public Codul surs pentru SQLite este n domeniul public. Nu exist nici o pretenie de drept de autor pe nici o parte din codul surs de baz. (Documentarea i codul test sunt o alt problem - unele seciuni din documentaie i logic testelor sunt guvernate de licene open-source.) Toi contribuabilii la coreul SQLite au semnat cum c nu au nici un interes de drept de autor asupra codului. Aceast nseamn c oricine este capabil s fac orice vrea cu codul surs SQLite (legal). Sunt alte motoare de baze de date SQL cu licene liberale care permit ca, codul s fie extins i liber folosit, dar acele alte motoare sunt nc guvernate de legea dreptului de autor. SQLite este diferit n aceea c acea lege a dreptului de autor nu i se aplic. Fiierele de cod surs pentru alte baze de date SQL ncep n mod normal cu un comentariu ce descrie drepturile tale de a copia, vedea sau modific acel fiier. Codul surs SQLite nu conine nici o liceenta att timp ct nu este guvernat de legea dreptului de autor. n schimbul unei licene codul surs SQLite ofer o binecuvntare: "Fie s faci bine i nu ru Fie s gseti iertare pentru tine i s ieri pe alii Fie s mpari liber, niciodat lund mai mult dect dai." Extensiile de limbaj SQL SQLite ofer un numr de mbuntiri limbajului SQL ce nu le gseti n mod obinuit n alte motoare de baze de date. Cuvntul rezervat EXPLAIN i alocarea tipului de date evident sunt specificate mai sus. SQLite de asemenea ofer declaraii c REPLACE i clauza ON CONFLICT

care permite control asupra rezolvrii conflictelor. SQLite suport ATTACH i DETACH, comenzi care permit ca mai multe baze de date independente s fie folosite n acelai query! SQLite definete API-uri care permit utilizatorului s adauge noi funcii SQL secvene cumulate. SQL neles de SQLite Librria SQLite implementeaz majoritatea limbajului SQL standard, ns omite nite caracteristici timp ce adaug altele, proprii, n acelai tinp. De asemenea ofer o list de cuvinte cheie (rezervate limbajului). SQLite n 5 minute[modificare] Aici afli ce faci pentru a ncepe s experimentezi SQLite fr a avea de citit sau configurat prea mult: Downloadeaz codul Ia o copie de program precompilat pentru maina ta, sau o copie a surselor i compileazale tu nsui. Viziteaz pagin de download pentru mai multe informaii. Creeaz o nou baz de date La un shell sau la fereastr DOS, introdu: "sqlite3 test.db". Aceast va creea o noua baz de date numit "test.db". (Poi folosi i alt nume dac doreti.) Introdu comenzi SQL n fereastr pentru a creea i popula noua baz de date. Documentaie adiional este disponibil aici. Scrie programe care folosesc SQLite Dedesubt este un simplu program TCL ce demonstreaz cum s foloseti interfaa TCL pentru SQLite. Programul execut declaraiileSQL transmise ca al doilea argument ctre baza de date definite de primul argument. Comenzile pentru a vizualiza pentru sunt comanda sqlite3 de pe linia 7 care deschide o baz de date SQLite i creeaz o noua comand TCL numit db pentru a accesa aceea baz de date, invocarea comenzii db pe linia 8 pentru a execut comenzile SQL n baza de date i nchiderea conexiunii cu baza de date pe ultima linie a scriptului. #!/usr/bin/tclsh if {$argc!=2} { puts stderr "Usage: %s DATABASE SQL-STATEMENT" exit 1 } load /usr/lib/tclsqlite3.so Sqlite3 sqlite3 db [lindex $argv 0] db eval [lindex $argv 1] x { foreach v $x(*) { puts "$v = $x($v)" } puts "" } db close Dedesubt este un simplu program C care demonstreaz cum s foloseti interfaa (mediul) C/C+ + pentru SQLite. Numele unei baze de date este dat de primul argument i al doilea argument este una sau mai multe declaraii SQL pentru a fi executate n baza de date. Apelurile de funcie la care trebuie s fi atent aici sunt apelul sqlite3_open() pe linia 19 care deschide baza de date, sqlite3_exec() pe linia 25 care execut comenzile SQL n baza de date i sqlite3_close() pe linia 30 care nchide conexiunea cu baza de date. #include <stdio.h> #include <sqlite3.h> static int callback(void *NotUsed, int argc, char **argv, char **azColName){ int i; for(i=0; i<argc; i++){ printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL"); }

printf("\n"); return 0; } int main(int argc, char **argv){ sqlite3 *db; char *zErrMsg = 0; int rc; if(argc != 3){ fprintf(stderr, "Usage: %s DATABASE SQL-STATEMENT\n", argv[0]); exit(1); } rc = sqlite3_open(argv[1], &db); if( rc ){ fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db)); sqlite3_close(db); exit(1); } rc = sqlite3_exec(db, argv[2], callback, 0, &zErrMsg); if(rc != SQLITE_OK){ fprintf(stderr, "SQL error: %s\n", zErrMsg); sqlite3_free(zErrMsg); } sqlite3_close(db); return 0; } Versiunea 3.0 a SQLite[modificare] Versiunea 3.0 a SQLite introduce schimbri importante n librrie, incluznd: Un format mai compact pentru fiierele bazei de date. Acordarea tipului de date actual i suportul pentru BLOB. Suport pentru text UTF-8 i UTF-16 Secvene de colatare text definite de utilizator. ROWID-uri pe 64-bit. Concuren mbuntit. Tipuri de date n versiunea 3.0 a SQLite[modificare] Versiunea 2 a SQLite stocheaz toate vlorile coloanelor c text ASCII. Versiunea 3.0 mbuntete aceast prin oferirea capacitii de a stoca numerele ntregi i numerele reale ntr-un format mai compact i capabilitatea de a stoca date BLOB. Fiecare valoare stocat n o baz de date SQLite (sau manipulate de motorul de baze de date) are una din urmatoareale clase de stocare: NULL. Valoarea este o valoare NULL. INTEGER. Valoarea este un ntreg cu semn, stocat n 1,2,3,4,6 sau 8 octei depinznd de mrimea valorii. REAL. Valoarea este o valoare cu virgule, stocat c un numr IEEE pe 8-octet, cu virgul. TEXT. Valoarea este un ir de caractere, stocat folosind codificarea bazei de date (UTF-8, UTF-16-BE sau UTF-16-LE). BLOB. Vloarea este un blob de date, stocat exact cum a fost introdus. C i n SQLite versiunea 2, orice coloan a unei baze de date versiunea 3.0, cu excepia coloanei INTEGER PRIMARY KEY, pot fi folosite pentru a stoca orice tip de valoare. Toate valorile date lui SQLite, fie c sunt literali ncorporai n declaraii SQL sau valori legate de declaraii SQL precompilate sunt atribuite unei clase de stocare nainte c declaraia SQL s fie executat. n condiiile de mai jos, motorul de baze de date poate converti valorile ntre clasele de stocare numerice (INTEGER sau REAL) i TEXT n timpul execuiei query-urilor. Clasele de stocare sunt iniial atribuite dup cum urmeaz:

Valorile specificate c literali c o parte a declaraiilor SQL sunt atribuite clasei de stocare TEXT dac sunt ntre ghilimele simple sau duble, INTEGER dac literalul este specificat c un numr fr ghilimele fr punct zecimal sau exponent, REAL dac literalul este un numr fr ghilimele cu un punct zecimal sau exponent i NULL dac valoarea este NULL. Literalii cu, clas de stocare BLOB sunt specificai folosind notaia X'ABCD'. Valorile furnizate folosind API-uri sqlite3_bind_* sunt atribuite clasei de stocare care se potrivete cel mai aproape de graniele tipului native (ex. sqlite3_bind_blob() leag o valoare de clas de stocare BLOB). Clas de stocare a unei valori care este rezultatul unui operator scalar SQL depinde de cel mai de la margine operator al expresiei. Funcii definite-utilizator pot ntoarce valori cu orice clas de stocare. Nu este n general posibil s se determine clas de stocare a rezultatului a unei expresii n timpul compilrii. Bibliografie[modificare] SQLite Situl oficial SQLite

SQL De la Wikipedia, enciclopedia liber SQL Paradigm Multi-paradigm Aprut n 1974 Dezvoltat de Donald D. Chamberlin Raymond F. Boyce Developer Sistem de tipare ISO/IEC static, puternic

Influenat de Agena, Common Query Language(CQL), Language Integrated Query(LINQ), Windows PowerShell, Ingres, QUEL OS Multi platform Website http://www.sql.org/ SQL (Structured Query Language - Limbaj Structurat de Interogare) este un limbaj de programare specific pentru manipularea datelor n sistemele de manipulare a bazelor de date relaionale (RDBMS), iar la origine este un limbaj bazat pe algebra relaional. Acesta are ca scop inserarea datelor, interogaii, actualizare i tergere, modificarea i crearea schemelor, precum i controlul accesului la date. A devenit un standard n domeniu (standardizat ANSI-ISO), fiind cel mai popular limbaj utilizat pentru creearea, modificarea, regsirea i manipularea datelor de ctre SGBD-urile (Sistemele de Gestiune a Bazelor de Date) relaionale. Pe lng versiunile standardizate ale limbajului, exist o mulime de dialecte i variante, unele proprietare, fiind specifice anumitor SGBD-uri i de asemenea coninnd extensii pentru a suporta SBD-urile (Sistemele de Baze de Date) obiectuale (obiectual-relaionale). SQL permite att accesul la coninutul bazelor de date, ct i la structura acestora. Cuprins [ascunde] 1 Istoric 2 Elementele limbajului SQL 3 Tipuri de date n SQL o 3.1 Interogri o 3.2 Logica ternar (3VL) 4 Manipularea datelor o 4.1 Instruciunile limbajului de manipulare a datelor 5 Tranzacii o 5.1 Instruciuni: 6 Limbajul de definire a datelor o 6.1 Instruciuni 7 Drepturi ale utilizatorilor SQL n reea o 7.1 Instruciuni 8 Legturi externe 9 Note Istoric[modificare] SQL a fost iniial dezvoltat la IBM de ctre Donald D. Chamberlin i Raymond F. Boyce n anul 1974. Iniial, numele era SEQUEL(Structured Query Language), avea ca scop manipularea i regsirea datelor stocate n bazele de date relaionale IBM. [1] La sfritul anilor '70, Relational Software, Inc. (n prezentOracle Corporation) a vzut potenialul acestor concepte descrise de Codd, Chamberlin i Boyce, i a dezvoltat propriul SQL RDBMS cu

aplicaii la U.S. Navy, Central Intelligence Agency i U.S. government. n iunie 1979, Relational Software, Inc. a introdus prima implementare comercial disponibil de SQL, Oracle. Dup testarea SQL, au aprut implementri ale acestui limbaj i din partea firmei IBM: SQL/DS i DB2. [2] Elementele limbajului SQL[modificare] Limbajul SQL este divizat n urmtoarele elemente: Clauze, care sunt componente ale instruciunilor i interogrilor. [3] Expresii, al cror efect este producerea de valori scalare sau tabele. Predicates, pot specifica condiii care sunt evaluate de SQL conform logicii ternare sau logicii booleene, n scopul limitrii efectelor instruciunilor, sau pentru a influena cursul programului. Interogrile, au ca scop regsirea datelor dup criterii specifice. Instruciunile, pot avea un efect persistent asupra datelor sau structurii datelor, sau pot controla tranzaciile, conexiunile sau cursul programului. n general, instruciunile SQL se termin cu caracterul punct-virgul (";"), dei acest lucru nu este obligatoriu n toate platformele SQL. Spaiile albe suplimentare sunt ignorate, dar ele pot fi folosite pentru lizibilitatea codului SQL. Tipuri de date n SQL[modificare] Oricrei coloane (sau cmp) dintr-un tabel SQL i este asignat un tip de dat, la fel ca n toate celelalte limbaje de programare. Tipurile de date sunt urmtoarele: CHARACTER (sau CHAR) - ir de caractere INTEGER (sau SMALLINT) - numr ntreg FLOAT, REAL sau DOUBLE PRECISION - numr real NUMERIC(precision, scale) sau DECIMAL(precision, scale) - numr zecimal , unde precision nseamn numrul de cifre din partea ntreag, scale nseamn numrul de zecimale. DATE - data zilei. TIME - ora. Funcia sistem NOW ntoarce data i ora curent. Interogri[modificare] Cea mai des utilizat instruciune n SQL este instruciunea SELECT. [4] [5] SELECT [ALL | DISTINCT] coloana1 [,coloana2] [INTO fiier] FROM tabel1 [,tabel2] [WHERE condiie] [ AND|OR condiie...] [GROUP BY list-coloane] [HAVING condiii] [ORDER BY list-coloane [ASC | DESC] ] Clauza INTO este utilizat pentru a transfera rezultatul interogrii ntr-o nou tabel; valabil n Microsoft Access, dar nu n toate platformele SQL. Clauza WHERE este utilizat pentru a specifica condiii trebuie s ndeplineasc coloanele din care se face selecia. Aceast condiie este o expresie logic obinut prin alicarea operatorilor conjuncie (AND) i disjuncie (OR) asupra unor expresii logice elementare obinute cu ajutorul operatorilor: = (egal), <> (diferit), < (mai mic dect), <= (mai mic sau egal dect), > (mai mare dect), >= (mai mare sau egal dect), LIKE (permite selectarea potrivirilor pariale cu ajutorul operatorului %; de exemplu: select city, state from towntable where state LIKE 'north%'); Clauza GROUP BY permite gruparea coloanelor multiple n scopul prelucrrii acestora prin funciile agregate: AVG - media aritmetic; COUNT - numrul articolelor; MAX maximul; MIN - minimul; SUM - suma. Exemplu: Maximul populaiei tuturor oraelor americane din statul Indiana:

SELECT MAX(population) FROM citylist WHERE state = 'Indiana'; Clauza HAVING Spre deosebire de clauza WHERE, acioneaz asupra rndurilor rezultate din clauza GROUP BY , aplicndu-le condiia, spre a fi ulterior prelucrare prin funciile agregate. Clauza ORDER BY Ordoneaz rezultatele interogrii n ordine alfabetic dup unul sau mai multe cmpuri. ASC nseamn n ordine cresctoare, iar DESC - ordine descresctoare. Ordinea implicit este cresctoare. Alte cuvinte cheie: ALL - Toate articolele; DISTINCT - Numai articolele unice, fr duplicate. Exemple: 1. Selectarea tuturor crilor din tabela Book, avnd preul mai mare dect 100.00, n ordinea cresctoare a titlurilor:

SELECT * FROM Book WHERE price>100.00 ORDER BY title; 2. Selectarea tuturor titlurilor crilor din tabelele Book i a autorilor crilor citii din tabela Authors: SELECT Book.title, Authors.name FROM Book INNER JOIN Authors ON Book.author = Authors.id GROUP BY Book.title; Logica ternar (3VL)[modificare] Ideea a fost introdus n SQL pentru a asigna valoarea Null nregistrrilor vide i informaiilor care lipsesc dintr-un cmp. [6] [7] [8] [9] Manipularea datelor[modificare] Limbajul de manipulare a datelor (DML) este un subset al SQL utilizat pentru a aduga, actualiza sau terge date. Instruciunile limbajului de manipulare a datelor[modificare] INSERT - insereaz un articol ntr-o tabel: INSERT INTO tabel (cmp1, cmp2, ...) VALUES (valoare1, valoare2, ...);

UPDATE - actualizeaz un set de articole:

UPDATE tabel SET cmp = valoare [WHERE condiie];

DELETE - terge un set de articole:

DELETE FROM tabel [WHERE condiie]; Tranzacii[modificare] Tranzaciile sunt utilizate pentru a controla n ce condiii se desfoar o succesiune a instruciunilor de manipulare a datelor. Instruciuni:[modificare] START TRANSACTION (sau BEGIN WORK, BEGIN TRANSACTION, n funcie de dialectul SQL) nceput de tranzacie. SAVE TRANSACTION (sau SAVEPOINT) salveaz starea bazei ntr-un punct al transaciei COMMIT Opereaz toate operaiile tranzaciei ca fiind permanente. ROLLBACK Anuleaz toate operaiile tranzaciei ncepnd cu ultimul COMMIT. Instruciunile COMMIT i ROLLBACK termin tranzacia curent i deblocheaz datele. Exemple: 1.

CREATE TABLE tbl_1(id int); INSERT INTO tbl_1(id) VALUES(1); INSERT INTO tbl_1(id) VALUES(2); COMMIT; UPDATE tbl_1 SET id=200 WHERE id=1; SAVEPOINT id_1upd; UPDATE tbl_1 SET id=1000 WHERE id=2; ROLLBACK to id_1upd; SELECT id from tbl_1; 2. START TRANSACTION; UPDATE Account SET amount=amount-200 WHERE account_number=1234; UPDATE Account SET amount=amount+200 WHERE account_number=2345; IF ERRORS=0 COMMIT; IF ERRORS<>0 ROLLBACK; Limbajul de definire a datelor[modificare] Limbajul de definire a datelor (DDL) gestioneaz structura datelor i indexului. Instruciuni[modificare] CREATE TABLE creeaz un tabel n mod linie de comand: CREATE TABLE tabel( cmp1 tip1, cmp2 tip2, ... PRIMARY KEY (index1, index2, ...) ); Exemplu: CREATE TABLE My_table( my_field1 INT, my_field2 VARCHAR(50), my_field3 DATE NOT NULL, PRIMARY KEY (my_field1, my_field2) );

[10]

ALTER TABLE modific structura unui tabel existent prin redenumirea/adugarea/tergerea/schimbarea structurii unei coloane sau index:

Redenumirea unui tabel ALTER TABLE tabel RENAME TO nume_nou_tabel; Adugarea de cmpuri noi ALTER TABLE table_name ADD ( cmp1 def1, col2 def2, ... ); Exemplu: ALTER TABLE supplier ADD (supplier_name varchar2(50), city varchar2(45)); Modificarea structurii unui cmp

ALTER TABLE table_name MODIFY (cmp1 tip1, cmp2 tip2, ... ); Exemplu: ALTER TABLE supplier MODIFY ( supplier_name varchar2(100) not null, city varchar2(75)); tergerea unui cmp ALTER TABLE tabel DROP COLUMN cmp; Exemplu: ALTER TABLE supplier DROP COLUMN supplier_name; Redenumirea unui cmp ALTER TABLE tabel RENAME COLUMN nume_vechi TO nume_nou; Exemplu: ALTER TABLE supplier RENAME COLUMN supplier_name to sname;

TRUNCATE TABLE terge toate articolele unui tabel:

TRUNCATE TABLE tabel;

DROP TABLE terge tabelul:

DROP TABLE tabel; Drepturi ale utilizatorilor SQL n reea[modificare] Limbajul de control al datelor (DCL) autorizeaz utilizatorii i grupurile care lucreaz cu o anumit baz de date. Instruciuni[modificare] GRANT acord unul sau mai multe drepturi unui utilizator sau grup. REVOKE (operaia invers) elimin unul sau mai multe drepturi unui utilizator sau grup. Exemple: 1. GRANT SELECT, UPDATE ON My_table TO some_user, another_user; 2. REVOKE SELECT, UPDATE ON My_table FROM some_user, another_user;

PostgreSQL De la Wikipedia, enciclopedia liber PostgreSQL este un sistem de baze de date relationale. Este disponibil gratuit sub o licent open source de tip BSD. PostgreSQL nu este controlat de nici o companie, i bazeaz dezvoltarea pe o comunitate rspndit la nivel global, precum i cteva companii dezvoltatoare. Cuprins [ascunde] 1 Numele produsului 2 Istorie 3 Caracteristici o 3.1 Limitri o 3.2 Limbaj procedural o 3.3 Indeci o 3.4 Triggere o 3.5 MVCC o 3.6 Reguli o 3.7 Tipuri de date o 3.8 Tipuri de obiecte definite de utilizator o 3.9 Motenire o 3.10 Replicare o 3.11 Alte carateristici o 3.12 Add-on-uri 4 Referine Numele produsului[modificare] La prima vedere numele poate parea dificil de pronunat. Dezvolatorii l pronun /postrs kju l/; (Audio sample, 5.6k MP3). Este uneori abreviat ca "Postgres", numele original. Numele reflect originea proiectului, ca o baz de date post-Ingress, autorii originali fiind de asemenea participani la dezvoltarea Ingress. Istorie[modificare] Caracteristici[modificare] Limitri[modificare] Cteva limitri generale [1] Dimensiunea maxim a bazei de date: nelimitat Dimensiunea maxim a unei tabele: 32 TB Dimensiunea maxim a unei nregistrri: 1,6 TB Dimensiunea maxim a unui cmp: 1 GB Numr maxim de nregistri ntr-o tabel: nelimitat Numr maxim de coloane ntr-o tabel: 250 - 1600 n funcie de tipul coloanelor Limbaj procedural[modificare] PostgreSQL permite folosirea limbajelor procedurale pentru a executa blocuri de cod direct n serverul de baze de date. Se pot folosi pentru a crea funcii definite de utilizator (subrutine, trigerre, agregate i funcii fereastr) sau pentru a crea blocuri ad hoc "DO". Instalarea standard a PostgreSQL permite utilizarea urmatoarelor limbaje: PL/pgSQL, un limbar asemnator cu PL/SQL existent in Oracle. PL/Tcl, pune la dispoziie Tcl PL/Perl, pune la dispoziie Perl PL/Python, pune la dispoziie Python, versiunea 2 sau 3. Alte limbaje disponibile n afara pachetului de baz includ: PL/Java, PL/php, PL/Ruby, etc. Indeci[modificare] La fel ca i alte baze de date, PostgreSQL permite utilizarea indecilor pentru accelerarea interogarilor. Suporta mai multe tipuri de indeci: B-tree, Hash, GiST sau GIN. Daca tipul nu este specificat la crearea indexului, se utilizeaz B-tree. Alte caracteristici suportate: Valorile indecilor pot fi calculate printr-o expresie sau o funcie.

Indeci pariali permit s se indexeaz doar o parte dintr-o tabel. Pot fi creai prin specificarea unei clauze WHERE la sfritul unei comenzi CREATE INDEX. Planificatorul este capabil s foloseasc mai muli indeci pentru a executa interogri complexe. Triggere[modificare] MVCC[modificare] Reguli[modificare] Tipuri de date[modificare] Tipuri de obiecte definite de utilizator[modificare] Motenire[modificare] Replicare[modificare] Alte carateristici[modificare] Add-on-uri[modificare] Referine[modificare] 1. ^ PostgreSQL:About [1]

Microsoft SQL Server De la Wikipedia, enciclopedia liber Microsoft SQL Server este un sistem de gestionare de baze de date relaionale (RDBMS) produs de compania american MicrosoftCorp. Limbajele primare de interogare sunt MS-SQL i T-SQL. Suport versiunea companiei Microsoft de SQL (Structured Query Language - limbaj structurat de interogri), cel mai rspndit limbaj pentru bazele de date. Este un sistem pentru ntreprinderi - se poate aplica bazelor de date de dimensiuni foarte mari. Scurt istorie[modificare] Codul de baz pentru Microsoft SQL Server i are originile n Sybase SQL Server i a reprezentat intrarea Microsoft pe piaa bazelor de date pentru ntreprinderi, concurnd cu Oracle, IBM i Sybase. Microsoft, Sybase si Ashton-Tate s-au unit pentru a crea i a scoate pe pia prima versiune numita SQL Server 4.2 pentru Win OS/2. Mai tarziu Microsoft a negociat pentru drepturi de exclusivitate la toate versiunile de SQL Server scrise pentru sistemele de operare Microsoft. Sybase i-a schimbat ulterior numele n Adaptive Server Enterprise, pentru a evita confuzia cu Microsoft SQL Server. SQL Server 7.0 a fost primul server de baze de date bazat pe GUI. O variant de SQL Server 2000 a fost prima variant comerciala pentru arhitectura Intel. Descriere[modificare] Microsoft SQL Sever foloseste o varianta de SQL numita T-SQL, sau Transact-SQL, o implementare de SQL-92 (standardul ISO pentru SQL) cu unele extensii. T-SQL in principal adauga sintaxa aditionala pentru procedurile stocate si pentru tranzactii. Standardele SQL necesita ACID; acesta este un acronim pentru cele 4 conditii pentru orice tranzactie: atomicitate, consistenta, izolare, durabilitate. MS SQL Server suporta ODBC (Open Database Connectivity).

MySQL
De la Wikipedia, enciclopedia liber

MySQL este un sistem de gestiune a bazelor de date relaional, produs de compania suedeza MySQL AB i distribuit sub Licena Public General GNU. Este cel mai popular SGBD open-source la ora actual[1], fiind o component cheie a stivei LAMP (Linux,Apache, MySQL, PHP). Dei este folosit foarte des mpreun cu limbajul de programare PHP, cu MySQL se pot construi aplicaii n orice limbaj major. Exist multe scheme API disponibile pentru MySQL ce permit scrierea aplica iilor n numeroase limbaje de programare pentru accesarea bazelor de date MySQL, cum are fi: C, C++, C#, Java, Perl, PHP, Python, FreeBasic, etc., fiecare dintre acestea folosind un tip spefic API. O interfa de tip ODBC denumit MyODBC permite altor limbaje de programare ce folosesc aceast interfa , s interac ioneze cu bazele de date MySQL cum ar fi ASP sau Visual Basic. n sprijinul acestor limbaje de programare, unele companii produc componente de tip COM/COM+ sau .NET (pentru Windows) prin intermediul crora respetivele limbaje s poat folosi acest SGBD mult mai uor dect prin intermediul sistemului ODBC. Aceste componente pot fi gratuite (ca de exemplu MyVBQL) sau comerciale. Licena GNU GPL nu permite ncorporarea MySQL n softuri comerciale; cei care doresc s fac acest lucru pot achiziiona, contra cost, o licen comercial de la compania productoare, MySQL AB. MySQL este component integrat a platformelor LAMP sau WAMP (Linux/Windows-Apache-MySQLPHP/Perl/Python). Popularitatea sa ca aplicaie web este strns legat de cea a PHP-ului care este adesea combinat cu MySQL i denumit Duo-ul Dinamic. n multe cri de specialitate este precizat faptul ca MySQL este mult mai uor de invat i folosit dect multe din aplicaiile de gestiune a bazelor de date, ca exemplu comanda de ieire fiind una simpl i evident: exit sau quit. Pentru a administra bazele de date MySQL se poate folosi modul linie de comand sau, prin descrcare de pe internet, o interfa grafic: MySQL Administrator i MySQL Query Browser. Un alt instrument de management al acestor baze de date este aplicaia gratuit, scris n PHP, phpMyAdmin. MySQL poate fi rulat pe multe dintre platformele software existente: AIX, FreeBSD, GNU/Linux, Mac OS X, NetBSD, Solaris, SunOS, Windows 9x/NT/2000/XP/Vista.

Legturi externe[modificare]

Wikimedia Commons conine materiale multimedia legate deMySQL

MySQL - situl oficial Ultimele versiuni Anunul achiziiei de ctre Oracle Database Master- Freeware MySQL Manager Optimizarea serverului MySQL Utilitar scris in PHP pentru gestionarea bazelor de date

Windows API
De la Wikipedia, enciclopedia liber

Windows API este o interfa destinat programrii aplicaiilor pentru sistemul de operare Microsoft Windows (API este acronimul dinlimba englez pentru Application Programming Interface). Windows API este cunoscut, n general, cu numele de Win32 API, ns denumirea Windows API reflect mai precis capacitile i utilitatea sa, suportul att pentru Windows 32 bii, ct i pentru Windows 64 bi i. Microsoft Windows SDK ( en. Software Development Kit) conine documentaia i unelte necesare programatorilor pentru a realiza aplicaii folosind Windows API. Prin Win32 API programatorul are acces direct la o mare parte a func iilor de nivel de baz (en. low-level) ale sistemului de operare, putnd crea aplicaii ntr-un mod foarte flexibil. Windows API conine o ofert de servicii pentru toate aplica iile bazate pe ferestre grafice (en. windows). Aceast interfa deprogramare permite utilizatorilor s realizeze o interfa grafic propriilor aplica ii, s acceseze sistemul computerului, memoria acestuia, dispozitivele (fie de intrare, fie de ieire), s implementeze sunete, imagini, video sau funciuni de reea (respectiv Internet) n aceste aplicaii. Programarea cu Windows API nseamn primirea, interpretarea, trimiterea de mesaje ctre ferestre, sau controale (obiecte controlabile - ex. ToolBox, EditBox, Button, Text, CheckBox). Funcia principal (en. main - WINAPI WinMain) a unei aplicaii Win32 conine o bucl (structur iterativ) (ex. while() n limbajul C++) n care sunt apelate funciile de preluare i traducere a mesajelor trimise de ctre utilizator (prin intermediul dispozitivelor de intrare, apoi al sistemului de operare, n cazul de fa Windows). Mesajele sunt interpretate i trimise mai departe ferestrei active. Mesajele pot fi trimise att de sistem, asemenea unor mesaje din "subcontient", dac ar fi s facem o comparaie cu creierul uman, ct i explicit, "contient", prin funcia SendMessage(). Fiecrei ferestre i se asociaz o procedur responsabil cu interpretarea mesajelor primite. Spre exemplu, dac unei ferestre i se trimite un mesaj de distrugere, aceasta dispare. Dac unui control de tip CheckBox i se trimite mesajul de validare, n dreptul su apare binecunoscutul marcaj de validare.

Vezi i[modificare]

Interfa de programare a aplicaiilor Microsoft Windows DirectX Limbajul C++

Legturi externe[modificare]

MSDN - Microsoft Developer Network Tutorial pentru Win32 API, n limba englez Articole legate de Windows API pe site-ul CodeProject Forum CODEXPERT, seciunea Windows API Site-ul CODEXPERT (comunitatea programatorilor de C++), limba romn

Introducere in SQLite
Data publicarii: 18-08-2006 - Copyright floorin SQLite este un sistem de gestiune al bazelor de date. Chiar dac unii dintre voi v-ai putea gndi c piaa este deja plin n aceast zon, s-ar putea ca citind acest articol s v rzgndii. Sigur c SQLite nu se va putea "pune" probabil niciodat cu "granzii" bazelor de date dar citii pn la capt fraza urmtoare i pun pariu c vei deveni curioi: SQLite se constituie dintr-un singur fiier, cam 250KB (ridicol nu?!), el nu trebuie instalat ci doar copiat pe calculatorul unde se dorete, nu ai nimic de administrat la el, nu necesit nici un driver sau mai tiu eu ce altceva adiional, implementeaz cam tot standardul SQL92, lucreaz cu tranzacii (ACID), baza de date este stocat ntrun singur fiier i culmea, mai poate fi i "sharat" ntre mai multe maini, la final v mai spun c testele indic pentru operaiile comune, ca SQLite este de cel puin 10 ori mai rapid dect PostgreSQL i de cel puin 2 ori dect MySQL. Mai suntei aici? Atunci v dau i vestea cea mai important: da, PHP poate s lucreze cu SQLite (i o face chiar bine). Acum, pentru c sunt sigur c nu mai plecai o s v dau i vetile proaste: nu implementeaz conceptul de "FOREIGN KEY constraints", nu tie RIGHT OUTER JOIN i nici FULL OUTER JOIN, view-urile sunt doar read-only (aici cred c exagerez un pic, parc n-ar fi un lucru aa ru) i da, aa este, nu exist noiunea de "user" deci comenzile GRANT sau REVOKE le putei uita cnd lucrai cu SQLite. Ce altceva nu mai tie: dac vrei s faci un ALTER TABLE atunci nu poi dect cu un ADD COLUMN (DROP COLUMN, ALTER COLUMN, ADD CONSTRAINT nu sunt implementate). V mai zic una (poate lucrul cel mai...) i apoi intrm n miezul problemei: SQLite nu implementeaz nici un tip de dat. Aa c exceptnd coloanele declarate ca fiind INTEGER PRIMARY KEY, putem insera orice oriunde. Altfel zis, orice coloan este capabil s reina un string. Pentru a alunga confuzia haidei s trecem la un exemplu concret: prietenii lui Bill s fac click pe http://www.sqlite.org/sqlite3-3.3.7.bin.gz n vreme ce inamicii lui s fac click pe http://www.sqlite.org/sqlite-2_8_17.zip Extragei, i unii i alii, singurul fiier din arhiva pe care tocmai ai salvat-o pe calculator. Acest fiier o s-l denumesc de acum nainte sqlite.exe (sub linux el se cheam n realitate sqlite3-3.3.7.bin ). Din prompt scriei sqlite.exe test.db (nu, sigur nu se va instala vreun virus). n momentul de fa e posibil s fii fericiii posesori ai unei baze de date ce se cheam test.db i al unui sistem capabil s o gestioneze, ce se cheam sqlite.exe. n sqlite promptul este sqlite>. Cine nu vede acest prompt s o ia de la nceput, ceilali continum, deci haidei s facem o tabel, scriei comanda create table personal(marca,nume,salariu) ; nu uitai de ; cci SQLite nu va interpreta comanda pn nu scriei acest ; Acum scriei: insert into personal values(123,RADU VASILE,1500) ; insert into personal values(456,POPESCU ION,1400) ; n momentul de fa avem o tabel ce se chem personal i care conine 2 nregistrri. Convingei-v scriind comanda (nu uitai de tasta Enter): select * from personal ; Acum c v-ai convins, ai remarcat c nu am declarat tipul coloanelor atunci cnd am creat tabela. Am fi putut scrie i create table personal(marca integer,nume character, salariu integer) ; dar am fi putut scrie i create table personal(marca,nume pana la 50 de caractere,salariu intreg pozitiv nu mai mare de 100000 ca ne ia Bodu la ochi) ; Cci practic, declaraia care urmeaz dup numele coloanei este doar o descriere, aa cum am mai spus SQLite nu implementeaz tipuri de data. Asta nu-l mpiedic sa returneze valoare 2900 la comanda: select sum(salariu) from personal; Dup cum vedei e o valoare corect, deci chiar ne putem bizui pe SQLite. Atenie, am fi putut scrie comanda insert into personal values(678,1400,RADU ION) ; SQLite nu se supr (pentru el nu exist tip de data). n schimb, un sum pe coloana salariu ne va returna tot valoarea 2900, ceea ce este iari bine. Tabela noastra are (mcar) o hib: putem introduce persoane diferite cu aceeai marca. SQLite ne poate ajuta n acest

sens aa c haidei s tergem tabela, deci scriei: drop table personal; i s o recrem astfel: create table personal(marca unique,nume character, salariu integer) ; ncercarea de a introduce 2 nregistrri cu aceeai marc va fi pedepsit acum de SQLite. n afar de comenzile standard SQL exist si un set de aa numite comenzi speciale ce nu au nevoie de separatorul ; i pe care le gasii la http://www.sqlite.org/sqlite.html Acum scriei comanda .quit ntruct mi-am propus s v strnesc curiozitatea i nu s prezint ntregul sistem SQLite, m opresc aici. Atept comentarii ...n funcie de ele poate voi reveni cu o continuare. See more at: http://www.tutorialeonline.net/ro/article/introducere-in-sqlite#sthash.b2E0D5xK.dpuf

Command Line Shell For SQLite


The SQLite library includes a simple command-line utility named sqlite3 (or sqlite3.exe on windows) that allows the user to manually enter and execute SQL commands against an SQLite database. This document provides a brief introduction on how to use the sqlite3 program. Getting Started To start the sqlite3 program, just type "sqlite3" followed by the name the file that holds the SQLite database. If the file does not exist, a new one is created automatically. The sqlite3 program will then prompt you to enter SQL. Type in SQL statements (terminated by a semicolon), press "Enter" and the SQL will be executed. For example, to create a new SQLite database named "ex1" with a single table named "tbl1", you might do this:
$ sqlite3 ex1 SQLite version 3.6.11 Enter ".help" for instructions Enter SQL statements terminated with a ";" sqlite> create table tbl1(one varchar(10), two smallint); sqlite> insert into tbl1 values('hello!',10); sqlite> insert into tbl1 values('goodbye', 20); sqlite> select * from tbl1; hello!|10 goodbye|20 sqlite>

You can terminate the sqlite3 program by typing your systems End-OfFile character (usually a Control-D). Use the interrupt character (usually a Control-C) to stop a long-running SQL statement. Make sure you type a semicolon at the end of each SQL command! The sqlite3 program looks for a semicolon to know when your SQL

command is complete. If you omit the semicolon, sqlite3 will give you a continuation prompt and wait for you to enter more text to be added to the current SQL command. This feature allows you to enter SQL commands that span multiple lines. For example:
sqlite> CREATE TABLE tbl2 ( ...> f1 varchar(30) primary key, ...> f2 text, ...> f3 real ...> ); sqlite>

Aside: Querying the SQLITE_MASTER table The database schema in an SQLite database is stored in a special table named "sqlite_master". You can execute "SELECT" statements against the special sqlite_master table just like any other table in an SQLite database. For example:
$ sqlite3 ex1 SQLite version 3.6.11 Enter ".help" for instructions sqlite> select * from sqlite_master; type = table name = tbl1 tbl_name = tbl1 rootpage = 3 sql = create table tbl1(one varchar(10), two smallint) sqlite>

But you cannot execute DROP TABLE, UPDATE, INSERT or DELETE against the sqlite_master table. The sqlite_master table is updated automatically as you create or drop tables and indices from the database. You can not make manual changes to the sqlite_master table. The schema for TEMPORARY tables is not stored in the "sqlite_master" table since TEMPORARY tables are not visible to applications other than the application that created the table. The schema for TEMPORARY tables is stored in another special table named "sqlite_temp_master". The "sqlite_temp_master" table is temporary itself. Special commands to sqlite3 Most of the time, sqlite3 just reads lines of input and passes them on to the SQLite library for execution. But if an input line begins with a dot ("."), then that line is intercepted and interpreted by the sqlite3 program itself. These "dot commands" are typically used to change the output format of queries, or to execute certain prepackaged query statements. For a listing of the available dot commands, you can enter ".help" at any time. For example:

sqlite> .help .backup ?DB? FILE .bail ON|OFF .databases .dump ?TABLE? ... .echo ON|OFF .exit .explain ON|OFF .genfkey ?OPTIONS?

.header(s) ON|OFF .help .import FILE TABLE .indices TABLE .iotrace FILE .load FILE ?ENTRY? .mode MODE ?TABLE?

.nullvalue STRING .output FILENAME .output stdout .prompt MAIN CONTINUE .quit .read FILENAME .restore ?DB? FILE .schema ?TABLE? .separator STRING .show .tables ?PATTERN? .timeout MS .timer ON|OFF .width NUM NUM ... sqlite>

Backup DB (default "main") to FILE Stop after hitting an error. Default OFF List names and files of attached databases Dump the database in an SQL text format Turn command echo on or off Exit this program Turn output mode suitable for EXPLAIN on or off. Options are: --no-drop: Do not drop old fkey triggers. --ignore-errors: Ignore tables with fkey errors --exec: Execute generated SQL immediately See file tool/genfkey.README in the source distribution for further information. Turn display of headers on or off Show this message Import data from FILE into TABLE Show names of all indices on TABLE Enable I/O diagnostic logging to FILE Load an extension library Set output mode where MODE is one of: csv Comma-separated values column Left-aligned columns. (See .width) html HTML <table> code insert SQL insert statements for TABLE line One value per line list Values delimited by .separator string tabs Tab-separated values tcl TCL list elements Print STRING in place of NULL values Send output to FILENAME Send output to the screen Replace the standard prompts Exit this program Execute SQL in FILENAME Restore content of DB (default "main") from FILE Show the CREATE statements Change separator used by output mode and .import Show the current values for various settings List names of tables matching a LIKE pattern Try opening locked tables for MS milliseconds Turn the CPU timer measurement on or off Set column widths for "column" mode

Changing Output Formats The sqlite3 program is able to show the results of a query in eight different formats: "csv", "column", "html", "insert", "line", "list", "tabs", and "tcl". You can use the ".mode" dot command to switch between these output formats. The default output mode is "list". In list mode, each record of a query result is written on one line of output and each column within that record is separated by a specific separator string. The default separator is a pipe symbol ("|"). List mode is especially useful when you are going to send the output of a query to another program (such as AWK) for additional processing.
sqlite> .mode list sqlite> select * from tbl1; hello|10

goodbye|20 sqlite>

You can use the ".separator" dot command to change the separator for list mode. For example, to change the separator to a comma and a space, you could do this:
sqlite> .separator ", " sqlite> select * from tbl1; hello, 10 goodbye, 20 sqlite>

In "line" mode, each column in a row of the database is shown on a line by itself. Each line consists of the column name, an equal sign and the column data. Successive records are separated by a blank line. Here is an example of line mode output:
sqlite> .mode line sqlite> select * from tbl1; one = hello two = 10 one = goodbye two = 20 sqlite>

In column mode, each record is shown on a separate line with the data aligned in columns. For example:
sqlite> .mode column sqlite> select * from tbl1; one two ---------- ---------hello 10 goodbye 20 sqlite>

By default, each column is at least 10 characters wide. Data that is too wide to fit in a column is truncated. You can adjust the column widths using the ".width" command. Like this:
sqlite> .width 12 6 sqlite> select * from tbl1; one two ------------ -----hello 10 goodbye 20 sqlite>

The ".width" command in the example above sets the width of the first column to 12 and the width of the second column to 6. All other column widths were unaltered. You can gives as many arguments to ".width" as necessary to specify the widths of as many columns as are in your query results.

If you specify a column a width of 0, then the column width is automatically adjusted to be the maximum of three numbers: 10, the width of the header, and the width of the first row of data. This makes the column width self-adjusting. The default width setting for every column is this auto-adjusting 0 value. The column labels that appear on the first two lines of output can be turned on and off using the ".header" dot command. In the examples above, the column labels are on. To turn them off you could do this:
sqlite> .header off sqlite> select * from tbl1; hello 10 goodbye 20 sqlite>

Another useful output mode is "insert". In insert mode, the output is formatted to look like SQL INSERT statements. You can use insert mode to generate text that can later be used to input data into a different database. When specifying insert mode, you have to give an extra argument which is the name of the table to be inserted into. For example:
sqlite> .mode insert new_table sqlite> select * from tbl1; INSERT INTO 'new_table' VALUES('hello',10); INSERT INTO 'new_table' VALUES('goodbye',20); sqlite>

The last output mode is "html". In this mode, sqlite3 writes the results of the query as an XHTML table. The beginning <TABLE> and the ending </TABLE> are not written, but all of the intervening <TR>s, <TH>s, and <TD>s are. The html output mode is envisioned as being useful for CGI. Writing results to a file By default, sqlite3 sends query results to standard output. You can change this using the ".output" command. Just put the name of an output file as an argument to the .output command and all subsequent query results will be written to that file. Use ".output stdout" to begin writing to standard output again. For example:
sqlite> .mode list sqlite> .separator | sqlite> .output test_file_1.txt sqlite> select * from tbl1; sqlite> .exit $ cat test_file_1.txt hello|10 goodbye|20 $

Querying the database schema The sqlite3 program provides several convenience commands that are useful for looking at the schema of the database. There is nothing that these commands do that cannot be done by some other means. These commands are provided purely as a shortcut. For example, to see a list of the tables in the database, you can enter ".tables".
sqlite> .tables tbl1 tbl2 sqlite>

The ".tables" command is similar to setting list mode then executing the following query:
SELECT name FROM sqlite_master WHERE type IN ('table','view') AND name NOT LIKE 'sqlite_%' UNION ALL SELECT name FROM sqlite_temp_master WHERE type IN ('table','view') ORDER BY 1

In fact, if you look at the source code to the sqlite3 program (found in the source tree in the file src/shell.c) you'll find exactly the above query. The ".indices" command works in a similar way to list all of the indices for a particular table. The ".indices" command takes a single argument which is the name of the table for which the indices are desired. Last, but not least, is the ".schema" command. With no arguments, the ".schema" command shows the original CREATE TABLE and CREATE INDEX statements that were used to build the current database. If you give the name of a table to ".schema", it shows the original CREATE statement used to make that table and all if its indices. We have:
sqlite> .schema create table tbl1(one varchar(10), two smallint) CREATE TABLE tbl2 ( f1 varchar(30) primary key, f2 text, f3 real ) sqlite> .schema tbl2 CREATE TABLE tbl2 ( f1 varchar(30) primary key, f2 text, f3 real ) sqlite>

The ".schema" command accomplishes the same thing as setting list mode, then entering the following query:

SELECT sql FROM (SELECT * FROM sqlite_master UNION ALL SELECT * FROM sqlite_temp_master) WHERE type!='meta' ORDER BY tbl_name, type DESC, name

Or, if you give an argument to ".schema" because you only want the schema for a single table, the query looks like this:
SELECT sql FROM (SELECT * FROM sqlite_master UNION ALL SELECT * FROM sqlite_temp_master) WHERE type!='meta' AND sql NOT NULL AND name NOT LIKE 'sqlite_%' ORDER BY substr(type,2,1), name

You can supply an argument to the .schema command. If you do, the query looks like this:
SELECT sql FROM (SELECT * FROM sqlite_master UNION ALL SELECT * FROM sqlite_temp_master) WHERE tbl_name LIKE '%s' AND type!='meta' AND sql NOT NULL AND name NOT LIKE 'sqlite_%' ORDER BY substr(type,2,1), name

The "%s" in the query is replace by your argument. This allows you to view the schema for some subset of the database.
sqlite> .schema %abc%

Along these same lines, the ".table" command also accepts a pattern as its first argument. If you give an argument to the .table command, a "%" is both appended and prepended and a LIKE clause is added to the query. This allows you to list only those tables that match a particular pattern. The ".databases" command shows a list of all databases open in the current connection. There will always be at least 2. The first one is "main", the original database opened. The second is "temp", the database used for temporary tables. There may be additional databases listed for databases attached using the ATTACH statement. The first output column is the name the database is attached with, and the second column is the filename of the external file.
sqlite> .databases

Converting An Entire Database To An ASCII Text File Use the ".dump" command to convert the entire contents of a database into a single ASCII text file. This file can be converted back into a database by piping it back into sqlite3. A good way to make an archival copy of a database is this:

$ echo '.dump' | sqlite3 ex1 | gzip -c >ex1.dump.gz

This generates a file named ex1.dump.gz that contains everything you need to reconstruct the database at a later time, or on another machine. To reconstruct the database, just type:
$ zcat ex1.dump.gz | sqlite3 ex2

The text format is pure SQL so you can also use the .dump command to export an SQLite database into other popular SQL database engines. Like this:
$ createdb ex2 $ sqlite3 ex1 .dump | psql ex2

Other Dot Commands The ".explain" dot command can be used to set the output mode to "column" and to set the column widths to values that are reasonable for looking at the output of an EXPLAIN command. The EXPLAIN command is an SQLite-specific SQL extension that is useful for debugging. If any regular SQL is prefaced by EXPLAIN, then the SQL command is parsed and analyzed but is not executed. Instead, the sequence of virtual machine instructions that would have been used to execute the SQL command are returned like a query result. For example:
sqlite> .explain sqlite> explain delete from tbl1 where two<20; addr opcode p1 p2 p3 ---- ------------ ----- ----- ------------------------------------0 ListOpen 0 0 1 Open 0 1 tbl1 2 Next 0 9 3 Field 0 1 4 Integer 20 0 5 Ge 0 2 6 Key 0 0 7 ListWrite 0 0 8 Goto 0 2 9 Noop 0 0 10 ListRewind 0 0 11 ListRead 0 14 12 Delete 0 0 13 Goto 0 11 14 ListClose 0 0

The ".timeout" command sets the amount of time that the sqlite3 program will wait for locks to clear on files it is trying to access before returning an error. The default value of the timeout is zero so that an error is returned immediately if any needed database table or index is locked. And finally, we mention the ".exit" command which causes the sqlite3 program to exit.

Using sqlite3 in a shell script One way to use sqlite3 in a shell script is to use "echo" or "cat" to generate a sequence of commands in a file, then invoke sqlite3 while redirecting input from the generated command file. This works fine and is appropriate in many circumstances. But as an added convenience, sqlite3 allows a single SQL command to be entered on the command line as a second argument after the database name. When the sqlite3 program is launched with two arguments, the second argument is passed to the SQLite library for processing, the query results are printed on standard output in list mode, and the program exits. This mechanism is designed to make sqlite3 easy to use in conjunction with programs like "awk". For example:
$ sqlite3 ex1 'select * from tbl1' | > awk '{printf "<tr><td>%s<td>%s\n",$1,$2 }' <tr><td>hello<td>10 <tr><td>goodbye<td>20 $

Ending shell commands SQLite commands are normally terminated by a semicolon. In the shell you can also use the word "GO" (case-insensitive) or a slash character "/" on a line by itself to end a command. These are used by SQL Server and Oracle, respectively. These won't work in sqlite3_exec(), because the shell translates these into a semicolon before passing them to that function. Compiling the sqlite3 program from sources The source code to the sqlite3 command line interface is in a single file named "shell.c" which you can download from the SQLite website. Compile this file (together with the sqlite3 library source code to generate the executable. For example:
gcc -o sqlite3 shell.c sqlite3.c -ldl -lpthread

Tcl/TK
De la Wikipedia, enciclopedia liber

Tcl/TK(Tool Command Language) este un limbaj de scripting bazat pe iruri de caractere, interpretate la rulare. Aceaste caracteristici i permit s fie portabil pe diferite sisteme de operare. Sintaxa sa are numai dousprezece reguli, dar are toate elementele necesare pentru a crea rapid programe n aproape orice domeniu. Permite dezvoltarea de aplicaii grafice care ruleaz pe Windows, Linux,MacOSX i pe multe alte platforme.

Rularea unui script TCL[modificare]


Exist trei modaliti diferite de a rula un script scris n limbaj TCL: 1. rularea comenzii ntr-o consol de tip Wish (modul interactiv)

2.

rularea unui script aflat ntr-un fiier din consol, folosind comanda source: source <nume_fiier.tcl>

3. invocarea unui script TCL dintr-un icon

Laborator 05 - Baze de date


Ce este SQLite?
SQLite este o bibliotec C care implementeaz un motor de baze de date SQLncapsulat, ofer posibilitatea de a-l introduce n diverse sisteme i nu necesit configurare. SQLite ocup o cantitate mic de stocare pe disc i de memorie(aprox. 250 KB), deci este o alegere perfect pentru crearea de baze de date pe mai multe sisteme de operare mobile. SQLite este diferit de majoritatea altor motoare de baze de date SQL prin aceea c a fost proiectat pentru a fi simplu: Simplu de administrat. Simplu de folosit. Simplu de a fi ncapsulat ntr-un program mai mare. Simplu de ntreinut i setat.

Comenzi de baz SQLite


Creare tabel

Crearea unei tabele n baza de date se realizeaz cu instruciunea: Sintaxa:


CREATE TABLE <nume_tabela> ( <nume_linie> <tip_de_date> <constrangeri> , <nume_linie> <tip_de_date> <constrangeri>);

Cele mai folosite constrngeri: Primary key este folosit pentru a identifica n mod unic linile din tabel not null specific faptul c acest coloan nu poate conine elemente cu valoarea null cteva exemple de tipuri de date ce pot fi folosite n SQLite: Integer, varchar, real, float, text, blob, etc. Exemplu:
CREATE TABLE Persoane ( id integer PRIMARY KEY autoincrement NOT NULL, nume varchar(255) NOT NULL, telefon varchar(255) NOT NULL, varsta integer NOT NULL);

Inserarea unei linii


Sintaxa:
INSERT INTO <nume_tabela> VALUES(<valoare1>, <valoare2>, <valoare3>, etc.);

Exemplu:
INSERT INTO Persoane VALUES(NULL,"Gigel","0743235122",43);

Modificarea valorii unei linii


Sintaxa:
UPDATE <nume_tabela> SET <nume_coloana> = <valoare_noua> WHERE <conditie>;

Exemplu:
UPDATE Persoane SET varsta = 30 WHERE nume = "Gigel";

Stergerea unei linii


Sintaxa:
DELETE FROM <nume_tabela> WHERE <conditite>;

Exemplu:
DELETE FROM Persoane WHERE nume = "Gigel";

Interogri
Sintaxa:
SELECT <nume_coloana> FROM <nume_tabel> WHERE <conditie>;

Exemplu:
SELECT nume FROM Persoane; SELECT nume FROM Persoane WHERE id = 3; SELECT nume FROM Persoane WHERE id BETWEEN 3 AND 6; SELECT nume FROM Persoane WHERE varsta BETWEEN 18 AND 48;

Rezultatul afiat va fi reprezentat de numele tuturor persoanelor din tabel care ndeplinesc condiiile. Dac se dorete afiarea mai multor coloane dintr-o tabel se procedeaz n felul urmtor:
SELECT nume, varsta, telefon FROM Persoane;

Dac se dorete afiarea tuturor informaiilor (coloanelor) se folosete *:


SELECT * FROM Persoane;

Android SQLite
SQLite este integrat n Android i nu necesit nicio configurare special pentru a putea fi folosit, managementul bazei de date fiind fcut de platforma Android. Baza de date aferent fiecrei aplicaii este salvat n directorul:

DATA/data/PACKAGE_NAME/databases/FILENAME

Gestionarea bazei de date SQLiteOpenHelper


SQLiteOpenHelper permite comunicarea cu baza de date. Pentru a crea i actualiza o baz de date n Android, vom folosi o subclas a clasei SQLiteOpenHelper. n constructorul subclasei se va apela metoda super() a acesteia, specificnd numele i versiunea bazei de date.

SQLiteDatabase
Database permite manipularea datelor din baza de date. Aceast clas ofer metode pentru a interoga, deschide, nchide i actualiza baza dedate, precum insert(), update() i delete(). O alt metod este execSQL(), care ofer posibilitatea de a executa n mod direct o instruciune SQL.

ContentValues
Cu ajutorul unui obiect de tip ContentValues putem defini chei/valori. Cheia reprezin identificatorul coloanei din tabel, iar valoarea reprezint coninutul unei nregistrri din

aceast coloan. Putem folosi ContentValues pentru inserri bazei de date.

i update-uri ale

Interogri
Interogrile ctre o baz de date pot prin fi create intermediul prin intermediul din metodelorrawQuerry() i querry() sau metodelor

SQLiteQueryBuilder, clas folosit pentru a construi interogri SQL.

Cursor
O interogare returneaz un obiect de tip Cursor care pointeaz ctre o linie din rezultatul ntors de querry. Funciile implementate de Cursor sunt: moveToFirst(): mut cursorul pe moveToNext(): mut cursorul pe getCount(): returneaz numrul de linii isAfterLast(): verific dac s-a ajuns la - get*(): funcii de acces a datelor din coloane; prima linie; urmtoarea linie; ntoarse de querry; sfritul interogrii.

Primii pai
Creai un proiect Android i agugai dou clase : Angajati i DataB. Clasa Angajati va conine informaii despre fiecare angajat(id, nume, departament):
public class Angajati { private int _id; private String _nume; private String _departament; public Angajati(){} // constructor public Angajati(int id, String nume, String _departament){ this._id = id; this._nume = nume; this._departament = _departament; } // constructor public Angajati(String nume, String _departament){ this._nume = nume; this._departament = _departament; }

Clasa Angajati nu este complet. Adugai metodele necesare pentru datele declarate n clas Pentru a facilita comunicarea cu baza de date, n clasa DataB vom extinde SQLiteOpenHelper:
import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; public class DataB extends SQLiteOpenHelper { // Versiune BD private static final int VERSIUNE_BD = 1;

// Nume BD private static final String NUME_BD = "Angajati_Firma"; // Tabela Angajati private static final String TABELA_ANGAJATI = "angajati"; // coloanele tabelei Angajati private static final String ID_KEY = "id"; private static final String NUME_KEY = "nume"; private static final String DEPARTAMENT_KEY = "departament";

public DataB(Context context) { super(context, NUME_BD, null, VERSIUNE_BD); } //Crearea bazei de date @Override public void onCreate(SQLiteDatabase db) { } // Actualizarea bazei de date @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { } }

Observai suprascrierea metodelor onCreate() ionUpgrade()

Operaii CRUD(Create, Read, Update, Delete)


n exemplele urmtoare vom implementa metodele necesare gestionrii bazei dedate. Crearea bazei de date:
@Override public void onCreate(SQLiteDatabase db) { String CREATE_EMPLOYERS_TABLE = "CREATE TABLE " + TABELA_ANGAJATI + "(" + ID_KEY + " INTEGER PRIMARY KEY, " + NUME_KEY + " TEXT," + DEPARTAMENT_KEY + " TEXT" + ")"; db.execSQL(CREATE_EMPLOYERS_TABLE); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL("DROP TABLE IF EXISTS " + TABELA_ANGAJATI); // Creaz din nou tabela onCreate(db); }

Metoda onCreate() este apelat de fiecare dat cnd baza de date este creat. Adugarea unei nregistrri n baza de date

n exemplul de mai jos, metoda addAngajat() accept ca parametru un obiect detip Angajati. Pe baza acestuia, vom construi obiecte de tip ContentValues. Dup ce introducem datele, vom nchide conexiunea cu baza de date:
// Adaugare angajat public void addAngajat(Angajati angajat) { SQLiteDatabase db = this.getWritableDatabase(); ContentValues valori = new ContentValues(); valori.put(NUME_KEY, angajat.getNume()); // Nume Angajat valori.put(DEPARTAMENT_KEY, angajat.getDepartament()); // Departament angajat // Inserare linie db.insert(TABELA_ANGAJATI, null, valori); //Inchiderea conexiunii cu baza de date db.close(); }

Citirea unei nregistrri Metoda getAngajat() accept

ca

parametru

id-ul

angajatului

returneaz

linia

corespunztoare din baza de date.


Angajati getAngajat(int id) { SQLiteDatabase db = this.getReadableDatabase(); Cursor cursor = db.query(TABELA_ANGAJATI, new String[] { ID_KEY, NUME_KEY, DEPARTAMENT_KEY }, ID_KEY + "=?", new String[] { String.valueOf(id) }, null, null, null, null); if (cursor != null) cursor.moveToFirst(); Angajati angajat = new Angajati(Integer.parseInt(cursor.getString(0)), cursor.getString(1), cursor.getString(2)); //Returneaza angajat return angajat; }

Metoda getAngajati() va returna un ArrayList cu toi angajaii existeni n bazade date:


//Toti angajatii public List<Angajati> getAngajati() { List<Angajati> angajatiList = new ArrayList<Angajati>(); // interogare String selectQuery = "SELECT * FROM " + TABELA_ANGAJATI;

SQLiteDatabase db = this.getWritableDatabase(); Cursor cursor = db.rawQuery(selectQuery, null); // face loop printre linii si adauga in lista if (cursor.moveToFirst()) { do { Angajati angajat = new Angajati(); angajat.setID(Integer.parseInt(cursor.getString(0))); angajat.setNume(cursor.getString(1));

angajat.setDepartament(cursor.getString(2));

// Adauga unui angajat in lista angajatiList.add(angajat); } while (cursor.moveToNext()); } // returneaza lista de angajati return angajatiList; }

Actualizarea unei nregistrri Metoda updateAngajat() va modifica o singur nregistrare din baza de date. Aceast metod accept ca parametru un obiect de tip Angajati :
// Update angajat public int updateAngajat(Angajati angajat) { SQLiteDatabase db = this.getWritableDatabase(); ContentValues values = new ContentValues(); values.put(NUME_KEY, angajat.getNume()); values.put(DEPARTAMENT_KEY, angajat.getDepartament()); // update linie return db.update(TABELA_ANGAJATI, values, ID_KEY + " = ?", new String[] { String.valueOf(angajat.getID()) }); }

tergerea unei nregistrri


public void stergeAngajat(Angajati angajat) { SQLiteDatabase db = this.getWritableDatabase(); db.delete(TABELA_ANGAJATI, ID_KEY + " = ?", new String[] { String.valueOf(angajat.getID()) }); db.close(); }

Exerciiu:
Adugai o nou clas DataBActivity n care s creai un obiect DataB. Insera i noi elemente n baza de date folosind operaiile CRUD.

Android Debug Bridge(ADB)

Android Debug Bridge reprezint un command line care permite comunicarea cu un emulator sau un device Android, un program client-server care include 3 componente: Un client, apelat prin comanda adb(ali clieni adb sunt plugin-ul ADT i DDMS-ul). Un server(ruleaz ca un proces n backgroud), care gestioneaz comunicarea dintre client i daemonul adb care ruleaz pe emulator sau device. Un daemon, care ruleaz ca un proces de fundal pe fiecare device sau emulator. Adb-ul poate fi gsit n:

<sdk>/platform-tools/.

Comenzi ADB
Pentru a folosi ADB shell, device-ul Android trebuie s fie root-at. Comenzile ADB pot fi rulate din linia de comand sau dintr-un script. Acestea au urmtorul format:

adb [-d|-e|-s <serialNumber>] <command>

nainte de a utiliza comenzi adb este important s cunoatem device-ul care este conectat la serverul adb. Aadar, vom utiliza comandaadb devices:
adb devices List of devices attached emulator-5554 emulator-5556 emulator-5558 device device device

Conectai-v la emualtor folosind comanda Executai comanda sqlite3

adb - s <serialNumber> shell


a v conecta la

<nume_baza_de_date> pentru

baza de date creat n exemplul aterior. Folosii .tables. Afiai elementele tabelei existente n baza de date.

Exerciii
1. n linia de comand s se creeze o baz de date care s conin dou tabele: una pentru autori i una pentru cri. Detaliile pe care baza de date trebuie s le rein sunt: numele autorului, anul de natere, numele volumelor i anul cnd au aprut. Cerine: Afisai numele tuturor autorilor. Afisai toate crile n formatul: <nume_carte> - <an_lansare>. S se afieze toate crile lui Creang. S se afieze cartile lansate n perioada 1890 - 1910.

S se afieze autorii care triau in anul 1853. 2. Creai un Task List simplu, care s poat permite adugarea,tergerea i modificarea unui anumit task din lista respectiv. Porniti de la urmatorul schelet decod: Schelet. Remember Liste[laborator 04] 3. Implementati interfata unei baze de date care contine doua tabele: profesori si cursuri. Ce trebuie sa faca aplicatia? sa adauge un profesor sa adauge un curs sa afiseze cursurile predate de un anume profesor sa afiseze cine preda un curs specificat Atentie! Interfata grafica a aplicatiei nu este importanta atat timp cat se satisfac cele 4 cerinte. 4. Implementati interfata unei baze de date ce contine studenti si cursuri avand in vedere ca la un curs participa mai multi studenti si ca un student are mai multe cursuri. Ce trebuie sa faca aplicatia? sa adauge un elev sa adauge un curs

sa afiseze toti studentii care participa la un anume curs sa afiseze toate cursurile unui student Atentie! Interfata grafica a aplicatiei nu este importanta atat timp cat se satisfac cele 4 cerinte.

Mai mult: Conexiunea cu o baz de date extern


Pentru a folosi o baz de date extern ntr-o aplicaie, va trebui s copiai fiierul corespunztor acesteia n directorul assets. Aceasta va fi copiat n path-ul bazei de date a aplicaiei, astfel nct API-ul SQLiteDatabase poate fi deschis i accesat n mod normal.

Copierea, deschiderea i accesarea bazei de date n aplicaia Android


drag and drop pentru a copia baza de date n directorul assets:

Utilizai

Creai o clas DatabaseHelper care s extind SQLiteOpenHelper :


class DataBaseHelper extends SQLiteOpenHelper{ //PATH-ul default al bazei de date private static String private static String private final Context cale_bd = "/data/data/<PACHET>/databases/"; nume_bd = "myDBName"; context;

private SQLiteDatabase dataB;

// Constructorul pstreaz o referin a contextului anterior // n scopul de a avea acces la resursele aplicaiei // @param context public DataBaseHelper(Context this.context = context; } public void newDB() throws IOException { boolean exista= checkDataBase(); if(exista){//nothing to do. Baza de date deja exista} else{ //apeland getReadeableDatabase() va fi creata o bd goala // in path-ul default. Astfel vom putea suprascrie bd. this.getReadableDatabase(); context) {

super(context, nume_bd, null, 1);

try { copyDataBase(); // copiem bd } catch (IOException e) {

throw new Error ("Error copying database"); } } } //verificam daca bd exista deja, pentru a evita recopierea //de fiecare data cand rulam aplicatia

private boolean verific(){ SQLiteDatabase checkBD = null; try { String cale= cale_bd + nume_bd; verific= SQLiteDatabase.openDatabase(cale, null, SQLiteDatabase.OPEN_READONLY); }catch(SQLiteException e){ //baza de date inca nu exista } if(verific!= null){ verific.close();} return verific != null ? true : false; } //Vom copia baza de date din folderul assets //in baza de date goala tocmai creata. private void copyDataBase() throws IOException { //Deschidem bd locala InputStream le_input = context.getAssets().open(nume_bd);

//path-ul catre bd goala creata anterior String new_outFile= cale_bd + nume_bd;

//deschidem bd goala OutputStream le_output= new FileOutputStream (new_outFile);

//transfer de bytes din le_input in le_output byte[] buffer = new byte[1024]; int length; while ((length = le_input.read(buffer))>0){ le_output.write(buffer, 0, length); }

//Close the streams le_output.flush(); le_output.close(); le_input.close(); } public void openDataBase() throws SQLException { //deschidem bd String cale= cale_bd+ nume_bd; dataB= SQLiteDatabase.openDatabase(cale, null, SQLiteDatabase.OPEN_READONLY); } @Override public synchronized void close() { if(dataB!= null) dataB.close(); super.close(); } @Override public void onCreate(SQLiteDatabase db) {} @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {} // TODO: metode pentru a accesa continutul bazei de date

Tutorial Java JDBC Baze de date : Partea 1 - 23 Mai


Pentru studiul conectivitatii aplicatiilor la bazele de date vom folosi aplicatia din figura de mai jos:

In principal aplicatia din exemplul de fata stie sa adauge o inregistrare noua intr-o baza de date si sa stearga sau sa modfice aceste intregistrari. Pentru stocarea inregistrarilor se foloseste o baza de date de tip Sqlite. A fost ales acest tip de baza de date pentru usurinta configurarii si a faptul ca intrega baza de data este incapsulata sub forma unui singur fisier nemaifiind nevoie de un server special pentru baza de date. Acest lucru face utilizarea Sqlite foarte usoara, permitandu-ne sa ne concentram in special pe codul Java. Pe de alta parte JDBC-ul a fost construit in asa fel incat sa se asigure independenta fata de sistemul de baza de date utilizat. Din acest motiv indiferent daca se foloseste o baza de date Sqlite, MySql, Apache Derby, DB2 etc. modul de lucru ramane in cea mai mare masura la fel. Pentru acest prim evemplu se creaza o baza de date care intr-o prima instanta va contine doar o singura tabela denumita salariati. Aceasta tabela are structura prezentata in codul SQL de mai jos:

Dat fiind faptul ca intregul mecanism de JDBC ruleaza independent de baza de datele folosita vom avea nevoie de un driver ca sa asigure comunicarea intre baza de date folosita si JDBC. Fiecare sistem de baza de date are propriul driver JDBC. Aceste drivere sunt livrate sub forma de JAR-uri si, de cele mai multe ori pot fi preluate de pe site-ul producatorulului respectivului sitem de baze de date. In cazul de fata pentru Sqlite, va trebui sa folosim jar-ul sqlitejdbc-v056 (cu timpul numele acestui jar este posibil sa se schimbe pe masura ce apar alte versiuni de driver). Conectarea la baza de date Pentru dezvoltarea aplicatiei de mai sus, primul pas care trebuie facut este realizarea conexiunii la baza de date. Dat fiind faptul ca avem o aplicatie web vom folosi urmatorea abordare: prin intermediul unui ServletContextListener, in momentul in care aplicatia porneste vom crea conexiunea la baza de date si o vom seta ca atribut pe contexul aplicatiei. In momentul in care un servlet sau JSP are nevoie de conexiune, aceasta va putea fi preluat folosind codul this.getServletContext().getAtribute(numeleConexiunii). Folosind aceasta modalitate evitam cazul in care de fiecare data cand se face o operatie asupra bazei de date sa deschidem o noua conexiune, caz in

care consumul de resurse ar fi foarte ridicat. Codul de mai jos creaza conexiunea la baza de date:

Pentru flexibilitate in deploymentul aplicatiei, am inclus numele bazei de date ca un parametru de initializare in web.xml (linia 6). In continuare in liniile 7 14 vom afla calea absoluta pentru fisierul care contine baza de date, vom incarca in memorie driverul si finalmente vom obtine o obiect de tip java.sql.Connection, care va reprezenta conexiunea noasta la aceasta baza de date. Acest obiect va fi stocat ca atribut pe context pentru a fi utilizat ulterior. La inchiderea aplicatiei vom dori de asemenea sa inchidem si conexiunea la baza de date, din acest motiv, in metoda contextDestroyed avem apelul connection.close(). Inserarea unei inregistrari in baza de date Urmatorul pas in dezvoltarea aplicatiei il constituie modalitatea in care putem introduce date in tabela salariati. Un anumit salariat are datele: id, nume si salariu. Pentru usurinta dezvoltarii aplicatiei vom folosi o clasa container pentru datele de tip salariat:

Datele care vor alcatui o inregistrare sunt citie din formularul de mai jos:

Pentru adaugarea unui salariat vom construi un servlet care se va ocupa de aceasta operatie. Acest servlet va fi apelat in momentul in care se face submit pentru formularul de mai sus. Codul servletului este prezentat mai jos:

Intr-o prima instanta se citesc parametrii care contin datele introduse in formular si dupa aceasta se preia atributul conexiune de pe contextul servletului. Modalitatea prin care se insereaza ceva intr-un tabel este prin executarea unei mici bucati de cod SQL. Acest cod este trimis folosind un obiect de tip Statement. Obiectele de tip Stamente sunt create folosind conexiunea la baza de date (linia 10). Codul SQL care se va executa este compus manual prin concatenarea partii statice a codului cu valorile preluate de pe request. In statementul de sql nu precizam nimic in cazul ID-ului. Acesta va fi generat automat de sistemul de baze de date si va fi inserat in tabela astfel incat sa fie unic. Acest modalitate de lucru degreveaza programatorul. Tags: Baze date, Java

Tutorial Java JDBC Baze de date : Partea 2 - 31 Mai


Interogarea unei baze de date in Java Prima pagina pe care o vede utilizatorul atunci cand intra in aplicatie este pagina afisata in imaginea de la inceputul acestui modul. Aceasta pagina este un JSP, care afiseaza rezultatele obtinute in urma interogarii bazei de date. Atunci cand utilizatorul intra in aplicatie este trimis catre un servlet care interogheaza baza de date. Dupa ce datele au fost extrase acestea sunt afisate folosind jsp-ul de mai devreme. Codul pentru servletul care interogheaza baza de date este prezentat mai jos:

Intr-o prima etapa se preia de pe context atributul care corespunde conexiunii. Vom folosi un obiect de tip LinkedList in care vom pune toti salariatii care se afla in aceasta tabela. Ca si la punctul anterior, interogarea bazei de date se va face tot prin executarea unui scurte intructiuni de SQL (linia 9). Spre deosebire insa de punctul anterior, nu vom folosi metoda executeUpdate(), ci se va folosi executeQuery(). Diferenta dintre cele doua consta in faptul ca executeQuery returneza un obiect de tip ResultSet in care sunt stocate rezultatele interogarii efectuate. Metodele executeUpdate() sunt folosite atunci cand se fac operatii de adaugare, stergere sau modificare a datelor. Obiectul de tip ResultSet este parcurs folosind metoda next(). Aceasta metoda muta cursorul cu un item la dreapta si returneaza true sau false, daca s-a ajuns la finalul elementelor sau nu. Pe langa metoda next(), mai exista o serie de alte metode de pozitionare a cursorului precum: absolute(int numarulRandului) (muta cursorul pe o anumita pozitie data), aftherLast(), beforeLast(), last() etc. Pentru o referinta completa a metodelor se poate consulta API-ul Java. Datele sunt extrase din ResultSet folosind metode de tip getTipData(). Astfel exista metode pentru extragere de int, String, float ect. Aceste metode primesc ca parametru fie numele coloanei de unde se doreste extragerea acestei date, fie numarul acestei coloane. De exemplu linia 12 din codul de mai sus putea fi inlocuita cu String nume = resultSet.getString(2). Pe masura ce este parcurs obiectul de tip ResultSet, datele care sunt extrase din acesta sunt

incapsulate in obiecte de tip Salariat si adaugate in LinkedListul declarat la linia 6. In momentul in care acest LinkedList este complet va fi stocat ca atribut pe sesiune si se va face trimitere catre pagina JSP care afiseaza datele. Codul acestei pagini este prezentat mai jos:

Pentru afisare folosim un tabel in care vom insera datele despre salariati. Pe langa aceste datele, pentru fiecare salariat in parte inseram si doua formulare. Din aceste formulare (blocurile de linii 42-47 si 50-53) singurele elemente care sunt vizibile sunt butoanele de submit. Formularele contin o serie de input-uri ascunse. Atunci cand cineva apasa de exemplu butonul de stergere pentru un anumit angajat avem nevoie de id-ul angajatului respectiv pentru a putea sti ce sa stergem din baza de date. Cand butonul de

stergere este apasat este trimis intreg formularul, inclusiv inputul ascuns care contine id-ul angajatului care trebuie sters. Stergerea unei inregistrari din baza de date in Java Ca mod de lucru stergere unei intregistrari dintr-o tabela se asemana destul de mult cu inserarea unei inregistrari: trebuie construit un obiect de tip Stament care va executa o instructiune SQL. Folosind id-ul obtinut din inputurile ascunse care se gasesc in pagina JSP vom scrie intr-un servlet StergeAngajatServlet.java, codul care va stege inregistrarea selectata:

Modificarea unei inregistrari (utilizarea PreparedStatement) In principiu, ca mod lucru, modficarea unei anumite inregistrari se poate face la fel ca si adaugare sau stergerea folosind un String, pe care il concateneam cu o serie de alte variabile, pentru a obtine forma finala a instructiunii de SQL. Insa in cazul in care aveam de-a face cu o instructiune SQL complicata si lunga se recomanda utilizarea obiectelor de tip PreparedStatement. Obiectele de acest tip permit crearea de instructiuni SQL parametrizate. De exemplu putem crea o instructione de forma UPDATE salariati SET NUME = ? , SALARIU = ? WHERE ID = ?. Ulterior folosind metode de genul setString(1,Gigi) sau setInt(2,90) putem indica ca in locul primului semn de intrebare sa fie pus stringul Gigi sau in locul celui de-al doilea semn de intrebare sa fie pus un int cu valoare 90. Mai jos aveti codul corespunzator servletului care face modificari pentru inregistrarile din tabela salariati:

Ca si in cazul stergerii, se folosesc inputurile ascunse din formularul JSP-ului care afiseaza datele:

Lucrul cu baze de date n Android


Scris de Mdlin Ggeanu // 10.07.2013 // 0 comentarii

ntr-unul dintrearticoleleprecedente,am vorbit desprepersistareadatelor , dar am vzut doar cumse pot memoraanumitevalori care in de configurareaaplicaiei. De multeori ns, vor apreai situaii n care vomaveade memoratmult mai mult dectsimplesetri.
De exemplu, putem s stocm local date care sunt trimise de un server, pentru a le folosi atunci cnd conexiunea la Internet nu este disponibil sau cnd avem de-a face cu fiiere de dimensiuni mari, cum ar fi cele de imagine, pe care nu ne permitem s le descrcm de fiecare dat . Pentru stocarea de informaie de dimensiuni mai mari, Android ne pune la dispoziie o baz de date local, unde o putem memora ntr-un mod structurat i uor accesibil.

Baza de date SQLite


De cele mai multe ori, ntlnim bazele de date n contextul unor aplicaii care au conexiune la unul sau mai multe servere i care extrag i scriu informaie din/n acestea. Cnd ne gndim la baze de date, cel mai probabil, ne vin n minte Oracle, SQL Server sau altele. Dac aceste baze de date sunt proiectate pentru a gestiona un volum foarte mare de informa ie, SQLite are o alt abordare, fiind o baz de date open-source, folosit cel mai des pentru a gestiona informa ia la nivel local. Cu toate c poate prima impresie las de dorit, e bine de tiut c SQLite este folosit n multe produse de renume, cum ar fi Mac OS X, Chrome i chiar Dropbox. La fel cum indic i numele, SQLite folosete Structured Query Language pentru a facilita accesul la datele stocate i a fost proiectat n special pentru a fi rapid , cu dimensiuni reduse i u or de folosit. Dar asta nu nseamn c nu este capabil. SQLite ofer suport pentru tranzac ii (care sunt atomice chiar i dup crash-uri de sistem), funcii, foreign keys, triggers i multe altele. Pentru a proteja datele, Android restricioneaz accesul la aceste baze de date, f cndu-le direct accesibile doar aplicaiei care le-a creat. Astfel, putem avea oricte baze de date cu oricte tabele fiecare, ele fiind accesibile claselor din aplicaie direct prin intermediul numelor lor.

Facilitile din SDK


SDK-ul beneficiaz de o serie de clase prin intermediul crora putem lucra cu SQLite. Ele sunt structurate n dou pachete: android.database i android.database.sqlite. Primul,android.database, nu este legat specific de SQLite i ofer o serie de abstractizri care ne ajut n implementarea de clase specifice aplicaiei noastre. Coninute n acest pachet sunt interfa a Cursor i clasa AbstractCursor. Cursorul reprezint un concept simplu pentru traversarea result set-urilor din baza de date, iternd peste ele i oferind acces la date rnd cu rnd. Interfaa Cursor definete o serie de metode pentru accesul de read/write la baza de date, iar AbstractCursor ofer o implementare de baz a acestora. De cele mai multe ori, vom fi nevoii s subclasmAbstractCursor pentru a oferi o implementare specific nevoilor noastre.

Cel de-al doilea pachet, android.database.sqlite, conine o serie de clase specifice SQLite. Cele mai importante ar fi SQLiteCursor, care este practic o implementare a Cursor pentru a traversa seturi de rezultate din SQLite, SQLiteDatabase, care este un wrapper ce expune metodele de access la o baz de date cum ar fi deschiderea i nchiderea conexiunilor i execu ia de query-uri, i nu n ultimul rnd, SQLiteOpenHelper.

O mn de ajutor
SQLiteOpenHelper

ocup un loc mai aparte, pentru c este o clas menit s creeze i s actualizeze

bazele de date, precum i versiunile lor. Este recomandat ca atunci cnd cre m o baz de date nou s subclasm aceast clas i s oferim o implementare specific. Iat un exemplu simplu:

public class DictionaryOpenHelper extends SQLiteOpenHelper {

private static final int DATABASE_VERSION = 2;

private static final String DICTIONARY_TABLE_NAME ="dictionary";

private static final String DICTIONARY_TABLE_CREATE =

"CREATE TABLE " + DICTIONARY_TABLE_NAME + " (" +

KEY_WORD + " TEXT, " +

KEY_DEFINITION + " TEXT);";

DictionaryOpenHelper(Context context) {

super(context, DATABASE_NAME, null, DATABASE_VERSION);

@Override

public void onCreate(SQLiteDatabase db) {

db.execSQL(DICTIONARY_TABLE_CREATE);

Un lucru important de tiut atunci cnd lucrm cu helper-ul este acela c baza de date nu este creat n momentul crerii instanei de helper, ci doar la apelul metodelor ce faciliteaz accesul efectiv la aceasta: getWritableDatabase(), dac dorim s scriem, saugetReadableDatabase(), dac dorim doar s citim. Aceste dou metode trec printr-o serie de operaii, n special cnd sunt apelate pentru prima dat . Este foarte important ca ele s nu fie apelate de pe main thread pentru c pot duce la blocarea temporar a aplicaiei. Pentru mai multe detalii legate de main thread veziarticolul anterior. La primul apel, metodele vor executa la rndul lor metodele onCreate(),onUpgrade() i/sau onOpen(). Aici, versiunea joac un rol important. Ea ncepe implicit de la 1 i trebuie incrementat pentru fiecare modificare succesiv. Astfel, atunci cnd dorim s lansm o versiune nou a aplica iei care folose te o baz de date cu structura modificat, versiunea trebuie incrementat . Dac ea este mai mare dect cea curent, metoda onUpgrade() va rula operaiile necesare modificrii structurii bazei de date existente, pentru a o aduce la noua form. Aceste operaii trebuie f cute cu aten ie, pentru a evita pierderea datelor deja existente. Din punct de vedere al interogrii bazei de date, toate query-urile se pot plasa prin metode dedicate. Se pot folosi att metode care primesc o serie de parametri i construiesc interogarea, ct i query-uri directe. Fiecare interogare va returna un Cursor, cu ajutorul cruia putem s iterm prin rndurile rezultatului. Iat un exemplu de query pe o baz de date:

public Cursor getAllContacts() {

String selectQuery = "SELECT * FROM table_name;

SQLiteDatabase db = this.getReadableDatabase();

Cursor cursor = db.rawQuery(selectQuery, null);

return cursor;

Aspectele specifice platformei se opresc ns aici. Tratarea result-set-urilor, parcurgerea prin intermediul cursorilor sau folosirea de query-uri mai complexe sunt similare cu cele din Java sau alte limbaje orientate pe obiecte. Desigur, i restul recomandrilor de good-practice legate de lucrul cu baze de date, cum ar fi crearea unui model obiectual pentru date i a unui data access layer pentru abstractizare, rmn valabile. n articolul urmtor vom vedea cum putem expune informaia pe care o avem stocat spre exterior, fcnd-o accesibil, ntr-un mod controlat, altor aplicaii.

S-ar putea să vă placă și