Lucrare de licent a [625804]

Ministerul Educat ¸iei Nat ¸ionale
Universitatea ”OVIDIUS” Constant ¸a
Facultatea de Matematic ˘a s ¸i Informatic ˘a
Specializarea Informatic ˘a
KitchenAid – aplicat ¸ie pentru gestiunea de
ret ¸ete culinare
Lucrare de licent ¸ ˘a
Coordonator s ¸tiint ¸ific:
Lect. univ. dr. B ˘autu Elena
Absolvent: [anonimizat] ¸a
2018

Abstract
KitchenAid este o aplicat ¸ie care ˆıi va permite utilizatorului s ˘a vizualizeze toate preparatele
aflate ˆın baza de date, s ˘a caute o ret ¸et ˘a dup ˘a numele acesteia, dup ˘a un ingredient introdus
sau dup ˘a categoria ˆın care se afl ˘a preparatul. De asemenea, utilizatorul poate s ˘a caute s ¸i
preparate care nu cont ¸in lactoz ˘a sau gluten. Totodat ˘a utilizatorul poate efectua c ˘aut˘ari s ¸i ˆın
funct ¸ie de num ˘arul de calorii cont ¸inut de preparat.
Am ales s ˘a proiectez aceast ˘a aplicat ¸ie deoarece sunt pasionat ˘a de g ˘atit s ¸i am dorit s ˘a aflu ce
se afl ˘aˆın spatele unei aplicat ¸ii de acest gen.
2

Abstract
KitchenAid is an application that will allow the user to view all the recipes in the database,
search for a recipe after the name, after an ingredient entered or the category of the recipe.
The user can also look for recipes that do not contain lactose or gluten. At the same time,
the user can search according to the number of calories contained in the recipe.
I chose to design and develop this app because I am passionate about cooking and I wanted
to find out what is behind an application of this sort.
3

Cuprins
Cuprins i
1 Introducere 2
1.1 Motivat ¸ie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.2 Context . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.3 Funct ¸ionalit ˘at ¸i . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.4 Sprecificat ¸ii tehnice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.5 Rezumatul lucr ˘arii . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
2 Starea actual ˘a a domeniului 5
2.1 Sistemul de operare Android . . . . . . . . . . . . . . . . . . . . . . . . . 5
2.2 Android API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
2.3 Android Studio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.4 Biblioteca Picasso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
2.5 SQLite . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
2.6 Biblioteca SQLiteDatabase . . . . . . . . . . . . . . . . . . . . . . . . . . 8
2.7 Biblioteca SQLiteOpenHelper . . . . . . . . . . . . . . . . . . . . . . . . 9
2.8 Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
2.9 XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
2.10 JSON . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
3 Solut ¸ia propus ˘a 13
3.1 Faza de proiectare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
3.1.1 Cazuri de utilizare . . . . . . . . . . . . . . . . . . . . . . . . . . 13
3.1.2 Baza de date a aplicat ¸iei KitchenAid . . . . . . . . . . . . . . . . . 18
3.1.3 Analiza bazei de date . . . . . . . . . . . . . . . . . . . . . . . . . 19
3.2 Implementare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
3.2.1 Implementarea bazei de date . . . . . . . . . . . . . . . . . . . . . 24
3.2.2 Activit ˘at ¸i . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
4 Prezentarea aplicat ¸iei 29
i

Cuprins Cuprins
4.1 Pagina principala . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
4.2 C ˘autare dup ˘a ingredient . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
4.3 Vizualizare ret ¸ete . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
4.4 Vizualizare categorii . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
4.4.1 Alegerea categoriei . . . . . . . . . . . . . . . . . . . . . . . . . . 33
4.5 Informat ¸ii nutrit ¸ionale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
4.5.1 Preparate care nu cont ¸in gluten sau lactoz ˘a . . . . . . . . . . . . . 35
4.5.2 C ˘autare ˆın funct ¸ie de ingredient . . . . . . . . . . . . . . . . . . . 36
4.5.3 C ˘autarea ˆın funct ¸ie de calorii . . . . . . . . . . . . . . . . . . . . . 38
5 Concluzii 42
5.1 Direct ¸ii viitoare de lucru . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
Referint ¸e bibliografice 43
1

Capitolul 1
Introducere
KitchenAid este o aplicat ¸ie dedicat ˘a iubitorilor de gastronomie. Mi-am propus s ˘a realizez o
unealt ˘a care s ˘a fie de ajutor ˆın g˘a sirea ret ¸etei potrivite. Aceasta este o aplicat ¸ie ce permite
unui utilizator s ˘a vizualizeze o list ˘a de ret ¸ete stocat ˘a de sistem. Utilizatorul va putea c ˘auta
anumite ret ¸ete dup ˘a diferite filtre, filtrele ajut ˆandu-l pe acesta s ˘a g˘aseasc ˘a o ret ¸et ˘a potrivit ˘a
pentru obiceiurile sale alimentare, dietele t ¸inute de acesta, sau chiar momentul zilei ˆın care
ret ¸eta va fi preg ˘atit˘a.
Utilizatorul va putea selecta o ret ¸et ˘a pentru a primi informat ¸ii suplimentare despre aceasta,
cum ar fi ingredientele, respectiv cantit ˘at ¸ile necesare prepar ˘arii ret ¸etei, num ˘arul de calorii
asociate preparatului pentru o sut ˘a de grame, modul de preparare, textul ret ¸etei s ¸i o poz ˘a a
ret ¸etei.
Un utilizator va putea c ˘auta o ret ¸et ˘a dup ˘a nume, sistemul afis ¸ ˆandu-i, ˆın cazul ˆın care a fost
g˘asit m ˘acar un preparat, o list ˘a cu toate ret ¸etele g ˘asite. Dac ˘a nu va fi gasit ˘a nicio ret ¸et ˘a,
sistemul va afis ¸a un mesaj corespunz ˘ator.
Aplicat ¸ia va oferi posibilitatea de a c ˘auta toate ret ¸etele apart ¸in ˆand fiecarei mese a zilei, pre-
cum micul dejun, pr ˆanzul s ¸i cina, dar s ¸i ret ¸ete ale unor deserturi sau gus ˘ari.De asemenea,
orice obiect din lista rezultat ˘a va putea fi selectat pentru a viziona mai multe informat ¸ii de-
spre preparat.
Nuˆın ultimul r ˆand, utilizatorul va putea afis ¸a liste filtrate dup ˘a diferite informat ¸ii nutrit ¸io-
nale, cum ar fi ret ¸ete ce nu cont ¸in gluten sau lactoz ˘a.Acesta va putea c ˘auta, la nevoie, toate
ret ¸etele care au mai multe sau mai put ¸ine calorii dec ˆat o valoare selectat ˘a de acesta, sau dup ˘a
un anumit ingredient.
Aplicat ¸ia nu va folosi o conexiune la internet, baza de date fiind actualizat ˘a dintr-un fis ¸ier
de tip JSON salvat local, s ¸i prin urmare un utilizator nu va putea ad ˘auga o ret ¸et ˘a.ˆIn viitor,
aplicat ¸ia va fi dezvoltat ˘a s ¸i va avea posibilitatea de a avea conturi personalizate, logare cu
Facebook s ¸i ad ˘augarea de ret ¸ete personale.
2

Introducere Motivat ¸ie
1.1 Motivat ¸ie
KitchenAid este o aplicat ¸ie android care ofer ˘a utilizatorilor posibilitatea de a alege ce ret ¸ete
doresc s ˘a g˘ateasc ˘a. Utilizatorii vor putea filtra ret ¸etele dup ˘a anumite criterii pentru a-i ajuta
s˘a g˘aseasc ˘a un preparat care le va satisface cererile.
Am ales aceast ˘a tem ˘a pentru licent ¸ ˘a deoarece am dezvoltat o pasiune pentru g ˘atit.ˆIn cadrul
acesteia voi dezvolta o aplicat ¸ie care va cont ¸ine ret ¸ete pentru orice mas ˘a a zilei, c ˆat s ¸i pentru
gust˘ari s ¸i deserturi.
Des ¸i exist ˘a multe alte aplicat ¸ii asem ˘an˘atoare, am ales s ˘a proiectez aceast ˘a aplicat ¸ie deoarece
am vrut s ˘aˆınt ¸eleg etapele dezvolt ˘arii unei aplicat ¸ii pentru dispozitivele mobile, mai precis,
a unei aplicat ¸ii care s ˘a ruleze ˆın Android. Am considerat proiectarea s ¸i dezvoltarea acestei
aplicat ¸ii o provocare s ¸i am folosit, astfel, lucrarea de licent ¸ ˘a, ca motor pentru dezvoltarea
mea.
1.2 Context
Ast˘azi telefoanele s ¸i internetul sunt lucruri indispensabile pentru orice persoan ˘a. Din acest
motiv c ˘art ¸ile de ret ¸ete nu mai sunt at ˆat de folosite, dar s ¸i pentru c ˘a este mult mai us ¸oar ˘a uti-
lizarea unei aplicat ¸ii care poate afis ¸a ret ¸etele doar printr-o simpl ˘a c˘autare. Astfel utilizatorii
economisesc timp nefiind nevoie s ˘a caute manual preparatele dorite.
Aplicat ¸ii asem ˘an˘atoare celei pe care am proiectat-o sunt: Cookpad [1], Ret ¸ete culinare [2],
Yummly Recipes Shopping List [3], iar buc ˘atari celebri precum Martha Stewart [4] s ¸i Jamie
Oliver [5] au propriile site-uri s ¸i aplicat ¸ii mobile.
1.3 Funct ¸ionalit ˘at ¸i
Ultilizatorul poate c ˘auta o ret ¸et ˘a doar dupa numele acesteia. Aceste preparate fiind prezentate
init ¸ial doar cu anumite caracteristici, apoi printr-un singur click pe ret ¸eta dorit ˘a se vor afis ¸a
toate datele despre aceasta.
ˆIn cazul ˆın care utilizatorul nu este decis ce ar dori s ˘a g˘ateasc ˘a, acesta are opt ¸iunea de a
vizualiza toate ret ¸etele prezente ˆın aplicat ¸ie.
C˘aut˘arile se pot face dup ˘a categoria ˆın care se ˆıncadreaz ˘a preparatul, spre exemplu cin ˘a,
desert sau gustare.
Utilizatorul poate efectua o c ˘autare dup ˘a ingredientul pe care dores ¸te s ˘aˆıl foloseasc ˘aˆın
3

Introducere Sprecificat ¸ii tehnice
compozit ¸ia preparatului. Astfel vor fii afis ¸ate toate retet ¸ele care vor cont ¸ine ingredientul
c˘autat.
Aplicat ¸ia cont ¸ine o c ˘autare dup ˘a caloriile num ˘arul de calorii asociat ret ¸etelor, deoarece exist ˘a
multe persoane care vor s ˘a aib ˘a grij ˘a la tot ceea ce m ˘anˆanc˘a sau care doresc s ˘aˆıs ¸i ment ¸in ˘a
greutatea.
Persoanele care urmeaz ˘a diete speciale, de tip ”f ˘ar˘a lactoz ˘a” sau ”f ˘ar˘a gluten”, indiferent de
motivul pentru care o fac (de nevoie, din cauze medicale sau din proprie init ¸iativ ˘a), vor avea
opt ¸iunea de a vizualiza acele ret ¸ete care nu prezint ˘aˆın compozit ¸ia lor acest tip de alergeni
alimentari.
1.4 Sprecificat ¸ii tehnice
Aplicat ¸ia KitchenAid poate rula pentru toate versiunile de Android de la 6.0 ˆın sus. Mediul
de dezvoltare folosit este Android Studio, iar limbajul de programare pe care l-am folosit
este Java. Ca sistem de gestiune a bazelor de date, am ales s ˘a folosesc SQLite.
Mediul de dezvoltare Andoid Studio este bazat pe programul IntelliJ IDEA [6]. Acesta a fost
creat pentru a dezvolta aplicat ¸ii Android dar poate rula s ¸i pe Linux, Windows dar s ¸i Mac OS
X.
Limbajul de programare Java este un limbaj orientat-obiect, lansat ˆın anul 1995 [7] s ¸i con-
ceput de James Gosling [8]. Acesta este asem ˘an˘ator din punct de vedere al sintaxei cu C s ¸i
C++.
SQLite reprezint ˘a un sistem de gestionare a bazelor de date relat ¸ionale. Acesta a fost proiec-
tat astfel ˆıncˆat s˘a fie simplu de utilizat, ˆıntret ¸inut dar s ¸i pentru a fii us ¸or de ˆıncapsulat ˆın
programe.
1.5 Rezumatul lucr ˘arii
Lucrarea de licent ¸ ˘a este organizat ˘a din 5 capitole. ˆIn primul capitol am prezentat motivat ¸ia
alegerii acestei teme pentru lucrarea de licent ¸a s ¸i am enunt ¸at cerint ¸ele funct ¸ionale pentru
aplicat ¸ia pe care am dezvoltat-o. ˆIn al doilea capitol am prezentat tehnologiile pe care le-am
folosit ˆın aplicat ¸ia mea. Capitolul 3 prezint ˘a pas ¸ii parcurp ¸entru a crea aplicat ¸ia. ˆIn Capitolul
4 am prezentat aplicat ¸ia pe care am proiectat-o. Capitolul 5 este un capitol unde prezint
concluziile, s ¸i direct ¸iile viitoare de dezvoltare a aplicat ¸iei.
4

Capitolul 2
Starea actual ˘a a domeniului
ˆIn cele ce urmeaz ˘a voi descrie succint tehnologiile pe care le folosesc ˆın aplicat ¸ia KitchenAid.
Am ales s ˘a proiectez pe sistemul de operare Android, iar mediul de dezvoltare ales este An-
droid Studio. Pentru baza de date am ales s ˘a folosesc sistemul de gestionare al bazelor de
date SQLite, dar datele sunt introduse cu ajutorul unui fis ¸ier JSON. Limbajul de programare
folosit este Java.
2.1 Sistemul de operare Android
Android este o platform ˘a software s ¸i un sistem de operare bazat pe kernel-ul Linux. Acesta
a fost dezvoltat de compania Google.
Andy Rubin, Rich Miner, Nick Sears s ¸i Chris White [9] sunt cofondatorii Android care au
continuat s ˘a lucreze cu Google dup ˘a cump ˘ararea acesteia ˆın anul 2005 [10]. Pe vremea aceea
nu se cunos ¸teau foarte multe lucruri despre Android, s ¸tiindu-se doar c ˘a produceau software
pentru telefoane mobile. Astfel s-a presupus c ˘a Google dores ¸te s ˘a intre pe piat ¸a telefoanelor
mobile.
Platforma Android s-a lansat la data de 5 noiebrie 2007 [11], iar aceast ˘a lansare a fost
anunt ¸at ˘a prin fondarea Open Handset Alliance. Acesta este un consort ¸iu de 48 de com-
panii de software, telecomunicat ¸ii s ¸i hardware, consacrat dezvolt ˘arii de standarde deschise
pentru dispozitivele mobile.
Cea mai mare parte a codului Android a fost lansat ˘a de c ˘atre Google sub licent ¸a Apache. Mai
apoi, din 21 octombrie 2008 [11], Android a devenit Open Source, dar nu ˆın totalitate. Primul
dispozitiv comercial lansat de Google care folosea sistemul de operare Android, acesta fiind
telefonul mobil HTC Dream [10]. Logo-ul Android a fost creat de c ˘atre Irina Blok ˆın anul
2007 [11]. Acesta s ¸i-a c ˆas ¸tigat popularitatea printre angajat ¸i ceea ce a facut ca Google s ˘a
lanseze oficial logo-ul ˆın anul 2008.
5

Starea actual ˘a a domeniului Android API
Figura 2.1 : Logo-ul Android1
2.2 Android API
Un API (acronim pentru Aplication Programming Interface) permite unui dezvoltator uti-
lizarea unui set de rutine, protocoale s ¸i instrumente pentru construirea aplicat ¸iilor software.
API-ul se foloses ¸te pentru a crea aplicat ¸ii pentru sistemul de operare Android.
Fiecare versiune de Android are un anumit API. Prima versiune comercial ˘a de Android a
fost 1.0 ˆın anul 2008 [ ?]. Pˆan˘a ast ˘azi au fost lansate s ¸i alte versiuni,iar ˆın afar ˘a de primele
dou˘a versiuni, acestea au nume de cod inspirate din domeniul cofet ˘ariei.
KitchenAid poate rula pe dispozitive cu API-ul minim de 23. Versiunea minim ˘a pe care
poate rula este cea 6.0, respectiv cea denumit ˘a Marshmallow. Des ¸i nu sunt probleme la
rularea aplicat ¸iei pe cea mai mic ˘a versiune ment ¸ionat ˘a, este de preferat folosirea API-ului
26, respectiv versiunea 8.0.
6

Starea actual ˘a a domeniului Android Studio
Figura 2.2 : Tabelul versiunilor Android [11]
2.3 Android Studio
Mediul de dezvoltare Andoid Studio este bazat pe programul IntelliJ IDEA [6]. Acesta a fost
creat pentru a dezvolta aplicat ¸ii Android, s ¸i poate rula pe Linux, Windows dar s ¸i Mac OS X.
Android Studio a fost anuntat ¸ ˆın data de 16 mai 2013 ˆın cadrul unei conferint ¸e Google I/O,
dar abia ˆın iunie 2014 a fost lansat ˘a versiunea beta 0.8. ˆIn decembrie 2014 a fost lansat ˘a
versiunea 1.0, aceasta fiind considerat ˘a stabil ˘a. Ultima versiune a fost lansat ˘aˆın iunie 2018,
aceasta av ˆand numarul 3.1.3 [11].
Android Studio utilizeaz ˘a Gradle, un sistem de rulare automat. Acesta ruleaz ˘a independent
de Android Studio, deci putem rula aplicat ¸ia folosindu-ne de linia de comanda, iar rezultatul
va fii acelas ¸i. De asemenea, Gradle este folosit pentru a converti proiectul ˆıntr-un APK
(Android Application Package).
7

Starea actual ˘a a domeniului Biblioteca Picasso
2.4 Biblioteca Picasso
Biblioteca Picasso este utilizat ˘a pentru ˆınc˘arcarea imaginilor ˆın aplicat ¸ie, aceasta utiliz ˆand
adesea doar o linie de cod. De asemenea biblioteca Picasso este folosit ˘a s ¸i deoarece:
.ajut˘a la reciclarea imaginilor din ImageView s ¸i desc ˘arc˘arii imaginilor ˆıntr-un adaptor
.realizeaz ˘a automat transform ˘ari de imagine complexe cu utilizare minim ˘a a memoriei.
Pentru a importa aceast ˘a bibliotec ˘a trebuie ad ˘augat ˘a linia urmatoare de cod ˆın fis ¸ierul gradle:
compile ’com.squareup.picasso:picasso:2.5.2’
2.5 SQLite
SQLite reprezint ˘a un sistem de gestionare a bazelor de date relat ¸ionale. Acesta a fost proiec-
tat astfel ˆıncat s ˘a fie simplu de utilizat, ˆıntret ¸inut dar s ¸i pentru a fi us ¸or de ˆıncapsulat ˆın
programe. ˆIn general bazele de date sunt de tipul client-server, dar SQLite este mai degraba
ˆıncorporat ˘aˆın aplicat ¸ie.
SQLite a fost creat de c ˘atre D. Richard Hipp ˆın anul 2000 [12]. Acesta proiecta software-ul
folosit la bordul distrugatoarelor de rachete pentru armata naval ˘a a Statelor Unite. Hipp s ¸i-a
dorit ca SQLite s ˘a fie funct ¸ional ˘a f˘ar˘a a instala un program pentru gestionarea bazei de date,
dar s ¸i s ˘a nu fie necesar un administrator al bazei de date.
Prima versiune de SQLite a fost lansat ˘aˆın luna august a anului 2000 [13]. De-a lungul
anilor aceasta a suferit diferite schimbari, iar ˆın anul 2011 [14] Hipp a anunt ¸at c ˘aˆıs ¸i dores ¸te
s˘a creeze o interfat ¸ ˘a NoSQL care va putea s ˘a gestioneze documente scrise ˆın JSON s ¸i s ˘a
dezvolte UnQLite, o baz ˘a de date orientat ˘a spre documente.
SQLite poate fii folosit pentru a:
.crea o baz ˘a de date
.defini tabele
.insera s ¸i schimba coloane
.rula interog ˘ari
2.6 Biblioteca SQLiteDatabase
Biblioteca SQLiteDatabase este utilizat ˘a pentru a folosi baza de date de tip SQLite ˆın An-
droid Studio. Aceasta prezint ˘a metode precum crearea, s ¸tergerea s ¸i executarea de comenzi
SQL.
8

Starea actual ˘a a domeniului Biblioteca SQLiteOpenHelper
Pentru a importa aceast ˘a bibliotec ˘a trebuie ad ˘augat ˘a linia urmatoare de cod ˆın clasa Database-
Helper ˆın care creez baza de date:
import android.database.sqlite.SQLiteDatabase;
2.7 Biblioteca SQLiteOpenHelper
Biblioteca SQLiteOpenHelper este utilizat ˘a pentru a folosi baza de date de tip SQLite ˆın
Android Studio. Aceasta ajut ˘a la managementul versiunii bazei de date, dar s ¸i la crearea
acesteia.
ˆIn clasa Databasehelper, unde se creaz ˘a baza de date, sunt implementate metodele onCre-
ate(SQLiteDatabase) s ¸ionUpgrade(SQLitedatabase, int, int) .
Pentru a putea utiliza aceast ˘a bibliotec ˘a trebuie ad ˘augat ˘a urmatoarea linie de cod ˆın clasa
DatabaseHelper ˆın care creez baza de date:
import android.database.sqlite.SQLiteOpenHelper;;
2.8 Java
Java este un limbaj de programare orientat spre obiecte creat de c ˘atre James Gosling, s ¸i a
fost lansat de compania Sun Microsystems ˆın anul 1995 [8]. Init ¸ial Java a fost numit Oak,
apoi Green, dar mai t ˆarziu acesta a luat numele Java de la cafeaua numit ˘a Java. ˆIn anul 2007
[15], Java a devenit Open Source, dar nu ˆın totalitate.
Creatorii Java au descris acest limbaj ca fiind unul simplu, orientat spre obiecte, sigur s ¸i
dinamic. Acesta ofer ˘a aproximativ toate funct ¸ionalit ˘at ¸ile C++, av ˆandˆın plus faptul c ˘a nu
trebuie s ˘a fie eliberat ˘a memoria folosit ˘a. Java este un limbaj care nu depinde de platforma
pe care ruleaz ˘a, acest fapt numindu-se WORA (write once and run anywhere) [15]. As ¸adar
putem scrie cod Java ˆıntr-un sistem de operare, spre exemplu Windows, s ¸i s ˘a rulam codul pe
altul, spre exemplu Mac OS X.
9

Starea actual ˘a a domeniului XML
Figura 2.3 : Executia unui program Java [16]
2.9 XML
XML (Extensible Markup Language) este un limbaj care ajut ˘a la codificarea informat ¸iilor
aflate ˆın documente. Acesta este us ¸or de citit s ¸i ˆınteles at ˆat de om c ˆat s ¸i de mas ¸in ˘a. W3C
(World Wide Web Consortium) a recomadat pentru prima dat ˘a limbajul XML ˆın anul 1998
[17].
ˆIn Android Studio se foloses ¸te XML pentru crearea interfet ¸elor. Acestea pot fii create prin
procedeul de tragere s ¸i plasare (drag and drop), astfel codul XML se creaza automat. Des ¸i
pare mai us ¸or procedeul prezentat precedent, este mai avantajoas ˘a crearea interfet ¸elor scriind
manual codul XML, acesta fiind us ¸or de scris s ¸i ˆınt ¸eles.
10

Starea actual ˘a a domeniului XML
Figura 2.4 : Interfat ¸ ˘a proiectat ˘a cu cod XML
Figura 2.5 : Cod XML pentru crearea interfet ¸ei
11

Starea actual ˘a a domeniului JSON
2.10 JSON
JSON (JavaScript Object Notation) este un format de interschimbare a datelor. Acesta
reprezint ˘a un format text care cont ¸ine convent ¸ii similare cu cele ale limbajelor C, s ¸i este
derivat din JavaScript.
JSON este construit pe dou ˘a tipuri de structuri:
.o list ˘a ordonat ˘a de valori, aceasta fiind realizat ˘aˆın limbaje sub forma de tablou, vector,
list˘a sau s ¸ir
.o colect ¸ie de perechi nume s ¸i valoare, aceasta fiind realizat ˘aˆın limbaje sub form ˘a de
obiect, structur ˘a sau tablou
Figura 2.6 : Formatul unui obiect JSON [18]
Figura 2.7 : Formatul unui tablou JSON [18]
12

Capitolul 3
Solut ¸ia propus ˘a
3.1 Faza de proiectare
3.1.1 Cazuri de utilizare
O diagrama complet ˘a a cazurilor de utilizare soft-ware prezint ˘a, din punct de vedere al
proiect ˘arii, toate funct ¸ionalit ˘at ¸ile aplicat ¸iei s ¸i actorii software, adic ˘a utilizatorii aplicat ¸iei,
ˆın cazul KitchenAid singurul actor fiind utilizatorul. Diagrama complet ˘a a cazurilor de uti-
lizare este urm ˘atoarea:
Figura 3.1 : Diagrama complet ˘a a cazurilor de utilizare
13

Solut ¸ia propus ˘a Faza de proiectare
C˘autarea ret ¸etelor dup ˘a ingredient
Descrierea cazului de utilizare: descrie interact ¸iunea dintre utilizator s ¸i sistem ˆın cazul ˆın care
utilizatorul solicit ˘a sistemului afis ¸area unei liste de ret ¸ete ce cont ¸in un ingredient selectat de
acesta.
Actor software:Utilizatorul.
Eveniment declans ¸ator:utilizatorul alege un ingredient s ¸i solicit ˘a afis ¸area listei de ret ¸ete care
cont ¸in ingredientul respectiv
Precondit ¸ii:aplicat ¸ia trebuie instalat ˘a pe un dispozitiv ce ruleaz ˘a sistemul de operare Android.
Postcondit ¸ii: sistemul afis ¸eaz ˘a lista dorit ˘a. Fluxul principal este:
Utilizator Sistem
1.Solicit ˘a c˘autarea unei ret ¸ete ce cont ¸ine
un anume ingredient
2.Introduce numele sau parte din numele
ingredientului3.Preia datele s ¸i verific ˘a dac ˘a exist ˘a vreo ret ¸et ˘a
ce cont ¸ine ingredientul c ˘autat[A1]
4.Afis ¸eaz ˘a lista ret ¸etelor
Fluxul alternativ este:
[A1]-Date incorecte sau nu exist ˘a ret ¸ete
1.Sistemul afis ¸eaz ˘a un mesaj corespunz ˘ator.
Figura 3.2 : Diagrama de activit ˘at ¸i a cazului de utilizare
Diagrama de activit ˘at ¸i prezint ˘a, din punct de vedere al proiect ˘arii, fluxul pe care ˆıl urmeaz ˘a
14

Solut ¸ia propus ˘a Faza de proiectare
interact ¸iunea utilizator-sistem, ˆın cazul de utilizare ales.
Figura 3.3 : Diagrama de secvent ¸e de sistem a cazului de utilizare
Diagrama de secvent ¸e ˆın faza de proiectare prezint ˘a fluxul pe care ˆıl urmeaz ˘a sistemul pentru
aˆındeplini cerint ¸a utilizatorului, utiliz ˆand metode pentru interact ¸iunea dintre clase.
Figura 3.4 : Diagrama de secvent ¸e ˆın faza de proiectare a cazului de utilizare
15

Solut ¸ia propus ˘a Faza de proiectare
Figura 3.5 : Diagrama de clase ˆın faza de proiectare
Diagrama de clase ˆın faza de proiectare prezint ˘a interact ¸iunea dintre clase ˆın cazul de utilizare
ales, afis ¸ ˆand de asemenea metodele specifice claselor.
C˘autarea preparatelor ˆın funct ¸ie de categorie
Descrierea cazului de utilizare: descrie comportamentul sistemului s ¸i interact ¸iunea cu uti-
lizatorul ˆın vederea afis ¸ ˘arii unei liste filtrate de preparate, filtrul fiind reprezentat de o cate-
gorie (de exemplu cin ˘a sau desert).
Actor software:Utilizatorul.
Eveniment declans ¸ator:utilizatorul cere afis ¸area unei liste filtrate ˆın funct ¸ie de categorie.
Precondit ¸ii:aplicat ¸ia trebuie instalat ˘a pe un dispozitiv ce ruleaz ˘a sistemul de operare An-
droid.
Postcondit ¸ii: sistemul afis ¸eaz ˘a lista dorit ˘a. Fluxul principal este:
Utilizator Sistem
1.Utilizatorul solicit ˘a afis ¸area unei liste
filtrate ˆın funct ¸ie de categorie
2.Utilizatorul alege categoria3.Sistemul creaz ˘a o list ˘a a
preparatelor filtrat ˘a dup ˘a categorie
4.Sistemul afis ¸eaz ˘a lista ret ¸etelor
16

Solut ¸ia propus ˘a Faza de proiectare
Figura 3.6 : Diagrama de activit ˘at ¸i a cazului de utilizare
Diagrama de activit ˘at ¸i prezint ˘a, din punct de vedere al proiect ˘arii, fluxul pe care ˆıl urmeaz ˘a
interact ¸iunea utilizator-sistem, ˆın cazul de utilizare ales.
Figura 3.7 : Diagrama de secvent ¸e de sistem a cazului de utilizare
17

Solut ¸ia propus ˘a Faza de proiectare
Figura 3.8 : Diagrama de secvent ¸e ˆın faza de proiectare a cazului de utilizare
Diagrama de secvent ¸e ˆın faza de proiectare prezint ˘a fluxul pe care ˆıl urmeaz ˘a sistemul pentru
aˆındeplini cerint ¸a utilizatorului, utiliz ˆand metode pentru interact ¸iunea dintre clase.
Figura 3.9 : Diagrama de clase ˆın faza de proiectare
Diagrama de clase ˆın faza de proiectare prezint ˘a interact ¸iunea dintre clase ˆın cazul de utilizare
ales, afis ¸ ˆand de asemenea metodele specifice claselor.
3.1.2 Baza de date a aplicat ¸iei KitchenAid
Se dores ¸te gestionarea informat ¸iilor din aplicat ¸ia KitchenAid.
ˆIn aceast ˘a aplicat ¸ie se vor afla informat ¸ii despre ret ¸ete culinare. Fiecare preparat va avea un
id, un nume, timp de preparare, textul ret ¸etei, num ˘arul de calorii s ¸i modul ˆın care acesta este
18

Solut ¸ia propus ˘a Faza de proiectare
preparat.
Modul de preparare s ¸i categoriile din care fac parte preparatele vor avea fiecare c ˆate un id s ¸i
un nume.
Fiecare preparat cont ¸ine anumite ingrediente, acestea av ˆand un id, un nume, numarul de
calorii/100g s ¸i daca prezint ˘a lactoz ˘a sau glucoz ˘aˆın cont ¸inutul lor.
Deoarece fiecare preparat cont ¸ine mai multe ingrediente, acestea formeaz ˘a o compozit ¸ie care
deasemenea va avea un id, numele preparatului, ingredientul s ¸i cantitatea acestuia.
3.1.3 Analiza bazei de date
Figura 3.10 : Diagrama entit ˘at ¸i – asociat ¸ii
ˆIn continuare voi prezenta tabelele ˆımpreun ˘a cu atributele lor s ¸i constr ˆangerile existente.
19

Solut ¸ia propus ˘a Faza de proiectare
Const ˆangerile pot fi 5 tipuri:
1.Constr ˆangeri de domeniu
2.Constr ˆangeri de existent ¸ ˘a
3.Constr ˆangeri de unicitate
4.Constr ˆangeri de tip cheie st ˘ain˘a
5.Constr ˆangeri de tip tuplu
Categorii – reprezint ˘a mult ¸imea categoriilor de m ˆancare de interes
1.Constr ˆangeri de domeniu:
.IdCategorie integer, primary key, autoincrement
.DenumireCategorie text
2.Constr ˆangeri de existent ¸ ˘a:
.IdCategorie
.DenumireCategorie
3.Constr ˆangeri de unicitate:
.DenumireCategorie – Este cheie deoarece dou ˘a categorii nu pot avea aceeas ¸i de-
numire
Mod de preparare – reprezint ˘a modurile de g ˘atire de interes
1.Constr ˆangeri de domeniu:
.IdModPreparare integer, primary key, autoincrement
.DenumireModPreparare text20

Solut ¸ia propus ˘a Faza de proiectare
2.Constr ˆangeri de existent ¸ ˘a:
.IdModPreparare
.DenumireModPreparare
3.Constr ˆangeri de unicitate:
.DenumireModPreparare – Este cheie deoarece dou ˘a moduri de preparare nu pot
avea aceeas ¸i denumire
Ingrediente – reprezint ˘a mult ¸imea ingredientelor care sunt cont ¸inute de preparate
1.Constr ˆangeri de domeniu:
.IdIngerdient integer, primary key, autoincrement
.DenumireIngredient text
.Calorii real
.Lactoz ˘a text
.Gluten text
2.Constr ˆangeri de existent ¸ ˘a:
.IdIngredient
.DenumireIngredient
.Lactoz ˘a
.Gluten
3.Constr ˆangeri de unicitate:
.DenumireIngredient – Este cheie deoarece dou ˘a ingrediente nu pot avea aceeas ¸i
denumire
Preparate – reprezint ˘a mult ¸imea preparatelor aflate ˆın aplicat ¸ie
1.Constr ˆangeri de domeniu:
.IdPreparat integer, primary key, autoincrement
.DenumirePreparat text
.TimpPreparare text
.TextRet ¸et ˘a text
.Num ˘arCalorii real
.Poz˘a text
2.Constr ˆangeri de existent ¸ ˘a:
.IdPreparat
.DenumirePreparat
.TimpPreparare
.TextRet ¸et ˘a
.Num ˘arCalorii
.Poz˘a
21

Solut ¸ia propus ˘a Faza de proiectare
3.Constr ˆangeri de tip chei straine:
.ModDePreparare- cheie str ˘ain˘a cu referint ¸ ˘a c˘atre tabela ModPreparare
ModPreparare:Preparate !Mod de preparare
" CONSTRAINT fk_prepara FOREIGN KEY ( " +
KEY_ModDePreparare + " ) REFERENCES "+
TABLE_ModPreparare + " ( " +
KEY_DenumireModPreparare + " ) "
4.Constr ˆangeri de unicitate:
.DenumirePreparat – Este cheie deoarece dou ˘a preparate nu pot avea aceeas ¸i den-
umire
Compozit ¸ie = (Preparate,Ingrediente)
Tabela Compozit ¸ie este o asociat ¸ie ˆıntre tabelele Preparate s ¸i Ingrediente, adic ˘a mult ¸imea
perechilor de forma (p,i) cu proprietatea c ˘a p este un preparat s ¸i i este un ingredient ce apare
ˆın ret ¸eta preparatului p.
1.Constr ˆangeri de domeniu:
.IdCompozit ¸ie integer, primary key, autoincrement
.NumePreparat text
.Ingredient text
.Cantitate text
2.Constr ˆangeri de existent ¸ ˘a:
.IdCompozit ¸ie
.NumePreparat
.Ingredient
.Cantitate
3.Constr ˆangeri de tip chei straine:
.NumePreparat – cheie str ˘ain˘a cu referint ¸ ˘a c˘atre tabela Preparate
NumePreparat:Compozit ¸ie !Preparate
" CONSTRAINT fk_nume FOREIGN KEY (" + KEY_NumePreparat +
") REFERENCES " + TABLE_Preparate + "("+
KEY_DenumirePreparat + ")"
.Ingredient – cheie str ˘ain˘a cu referint ¸ ˘a c˘atre tabela Ingrediente
Ingredient:Compozit ¸ie !Ingrediente
" CONSTRAINT fk_ingr FOREIGN KEY (" + KEY_Ingredient+ ")
REFERENCES " + TABLE_Ingrediente + "(" +
KEY_DenumireIngredient + ")"
22

Solut ¸ia propus ˘a Faza de proiectare
4.Const ˆangeri de unicitate:
.NumePreparat.Ingredient – deoarece un ingredient nu poate face parte de mai
multe ori dintr-un preparat
CategoriePreparat =(Categorie,Preparat)
Tabela CategoriePreparat este o asociat ¸ie ˆıntre tabelele Categorie s ¸i Preparat, adic ˘a mult ¸imea
perechilor de forma (c,p) cu proprietatea c ˘a c este o categorie s ¸i p este un preparat ce apart ¸ine
categoriei c.
1.Constr ˆangeri de domeniu:
.IdCategoriePreparat integer, primary key, autoincrement
.Categorie text
.Preparat text
2.Constr ˆangeri de existent ¸ ˘a:
.IdCategorie
.Categorie
.Preparat
3.Constr ˆangeri de tip chei straine:
.Categorie – cheie str ˘ain˘a cu referint ¸ ˘a c˘atre tabela Categorii
Categorie:CategoriePreparat !Categorii
"CONSTRAINT fk_categ FOREIGN KEY (" + KEY_Categorie + ")
REFERENCES "+ TABLE_Categorii + "(" +
KEY_DenumireCategorie + ")"
.Preparat – cheie str ˘ain˘a cu referint ¸ ˘a c˘atre tabela Preparate Preparat:CategoriePreparat
!Preparate
"CONSTRAINT fk_prep FOREIGN KEY ("+ KEY_Preparat + ")
REFERENCES " + TABLE_Preparate + "(" +
KEY_DenumirePreparat + ") "
4.Constr ˆangeri de unicitate:
.Categorie.Preparat – deoarece un preparat nu poate fi listat de mai multe ori ˆın
cadrul aceleias ¸i categorii
23

Solut ¸ia propus ˘a Implementare
3.2 Implementare
3.2.1 Implementarea bazei de date
Baza de date a aplicat ¸iei este proiectat ˘aˆın Android Studio, dar cu cod SQLite. Pentru a
putea proiecta baza de date direct ˆın aplicat ¸ie a fost nevoie s ˘a creez o clas ˘a separat ˘aˆın care
s˘a lucrez cu tot ce are leg ˘atur˘a cu datele stocate ˆın baza de date.
Pentru a putea s ¸tii la a c ˆata versiune a bazei de date sunt a trebuit sa creez un integer care va
fii actualizat de fiecare dat ˘a cˆand voi schimba schema bazei de date.
public class DatabaseHelper extends SQLiteOpenHelper {
private static final String LOG = "DatabaseHelper";
private static final int DATABASE_VERSION = 2;
private static final String DATABASE_NAME = "db";
Fiecare tabel este init ¸ializat, astfel acesta primes ¸te un nume unic, pentru ca mai apoi fiec ˘arei
tabele i se vor asocia coloane.
private static final String TABLE_Categorii = "Categorii";
private static final String TABLE_ModPreparare = "ModPreparare";
private static final String TABLE_Ingrediente = "Ingrediente";
private static final String TABLE_Preparate = "Preparate";
private static final String TABLE_CategoriePreparat = "
CategoriePreparat";
private static final String TABLE_Compozitie = "Compozitie";
private static final String KEY_IdCategorie = "idCategorie";
private static final String KEY_DenumireCategorie = "
denumireCategorie";
Dupa init ¸ializarea tuturor componentelor, se va crea c ˆate o interogare pentru fiecare tabela,
deoarece acestea vor fi create separat.
private static final String CREATE_TABLE_Categorii = "CREATE TABLE "
+ TABLE_Categorii + "(" + KEY_IdCategorie + " INTEGER PRIMARY
KEY AUTOINCREMENT,"
+ KEY_DenumireCategorie + " TEXT UNIQUE NOT NULL" + ")";
private static final String CREATE_TABLE_CategoriePreparat = "CREATE
TABLE "
+ TABLE_CategoriePreparat + "(" + KEY_IdCategoriePreparat + "
INTEGER PRIMARY KEY AUTOINCREMENT,"
+ KEY_Categorie + " TEXT NOT NULL," + KEY_Preparat + " TEXT
NOT NULL, CONSTRAINT fk_prep FOREIGN KEY ("
+ KEY_Preparat + ") REFERENCES " + TABLE_Preparate + "(" +
KEY_DenumirePreparat + ") ,"
+ " CONSTRAINT fk_categ FOREIGN KEY (" + KEY_Categorie + ")
REFERENCES "
+ TABLE_Categorii + "(" + KEY_DenumireCategorie + ")" + ")";
24

Solut ¸ia propus ˘a Implementare
Cu ajutorul bibliotecii SQLiteOpenHelper, implementez metodele onCreate(SQLiteDatabase)
sionUpgrade(SQLitedatabase, int, int) .
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREATE_TABLE_Categorii);
db.execSQL(CREATE_TABLE_ModPreparare);
db.execSQL(CREATE_TABLE_Ingrediente);
db.execSQL(CREATE_TABLE_Preparate);
db.execSQL(CREATE_TABLE_CategoriePreparat);
db.execSQL(CREATE_TABLE_Compozitie);
}
public void onUpgrade(SQLiteDatabase db, int oldVersion, int
newVersion) {
db.execSQL("DROP TABLE IF EXISTS " + TABLE_Categorii);
db.execSQL("DROP TABLE IF EXISTS " + TABLE_ModPreparare);
db.execSQL("DROP TABLE IF EXISTS " + TABLE_Ingrediente);
db.execSQL("DROP TABLE IF EXISTS " + TABLE_Preparate);
db.execSQL("DROP TABLE IF EXISTS " + TABLE_CategoriePreparat);
db.execSQL("DROP TABLE IF EXISTS " + TABLE_Compozitie);
onCreate(db);
}
Fiecare tabela ca avea asociat c ˆate o clasa care va purta numele tabelei. ˆIn aceast ˘a clas ˘a vom
defini un obiect de tipul tabelei, aceasta av ˆand ca atribute numele coloanelor tabelei aferente.
V oi exemplifica pentru tabela numit ˘a Ingrediente:
public class Ingrediente {
int idIngredient;
String denumireIngredient;
float calorii;
String lactoza;
String gluten;
public Ingrediente(){
}
public Ingrediente(String denumireIngredient, float calorii,String
lactoza,String gluten){
this.denumireIngredient=denumireIngredient;
this.calorii=calorii;
this.lactoza=lactoza;
this.gluten=gluten;
}
Pentru fiecare atribut al obiectului se vor crea metode de tip get s ¸i set deoarece acestea vor fi
folosit ¸i la crearea unui obiect de acel tip.
public long createIngredient(Ingrediente ingrediente) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(KEY_DenumireIngredient, ingrediente.
getDenumireIngredient());
values.put(KEY_Calorii, ingrediente.getCalorii());
values.put(KEY_Lactoza, ingrediente.getLactoza());
25

Solut ¸ia propus ˘a Implementare
values.put(KEY_Gluten, ingrediente.getGluten());
long idIngredient = db.insert(TABLE_Ingrediente, null, values);
return idIngredient;
}
Pentru a afla informat ¸ii aflate ˆın oricare dintre tabele voi folosi interog ˘ari. Acestea vor fi
declarate ˆın aceeas ¸i clas ˘a, respectiv DatabaseHelper. Pentru a obt ¸ine toate informat ¸iile sto-
cate ˆıntr-o tabela voi folosi o interogare simpla, care m ˘a va ajuta sa salvez datele obt ¸inute
ˆıntr-o list ˘a de tipul obiectelor pe care doresc s ˘a le obt ¸in.
public List<Ingrediente> getAllIngrediente() {
List<Ingrediente> ingredient = new ArrayList<Ingrediente>();
String selectQuery = "SELECT *FROM " + TABLE_Ingrediente;
Log.e(LOG, selectQuery);
SQLiteDatabase db = this.getReadableDatabase();
Cursor c = db.rawQuery(selectQuery, null);
if(c.moveToFirst()) {
do{
Ingrediente ingrediente = new Ingrediente();
ingrediente.setIdIngredient(Integer.valueOf(c.getString
(0)));
ingrediente.setDenumireIngredient(c.getString(1));
ingrediente.setCalorii(Float.valueOf(c.getString(2)));
ingrediente.setLactoza(c.getString(3));
ingrediente.setGluten(c.getString(4));
ingredient.add(ingrediente);
}while (c.moveToNext());
}
return ingredient;
}
Pentru a obt ¸ine informat ¸ii din mai multe tabele voi folosi interog ˘ari mai complexe. De
exemplu voi dori sa obt ¸in toate preparatele care nu cont ¸in lactoz ˘a:
public List<Preparate> getAllPreparateLactoza() {
List<Preparate> preparat = new ArrayList<Preparate>();
String selectQuery = "SELECT *FROM " + TABLE_Preparate + " p
INNER JOIN " + TABLE_Compozitie
+ " c ON c." + KEY_NumePreparat + " = p." +
KEY_DenumirePreparat + " WHERE p."
+ KEY_DenumirePreparat + " NOT IN (" + "SELECT c." +
KEY_NumePreparat + " FROM " + TABLE_Ingrediente + " i
INNER JOIN "
+ TABLE_Compozitie + " c ON i." + KEY_DenumireIngredient
+ " = c." + KEY_Ingredient + " WHERE "
+ KEY_DenumireIngredient + " NOT IN (" + "SELECT " +
KEY_DenumireIngredient + " FROM "
+ TABLE_Ingrediente + " WHERE " + KEY_Lactoza + " LIKE \’
nu\’ ))";
Log.e(LOG, selectQuery);
SQLiteDatabase db = this.getReadableDatabase();
Cursor c = db.rawQuery(selectQuery, null);
if(c.moveToFirst()) {
do{
26

Solut ¸ia propus ˘a Implementare
Preparate preparate = new Preparate();
preparate.setIdPreparat(Integer.valueOf(c.getString(0)));
preparate.setDenumirePreparat(c.getString(1));
preparate.setTimpPreparare(c.getString(2));
preparate.setTextReteta(c.getString(3));
preparate.setNumarCalorii(Float.valueOf(c.getString(4)));
preparate.setPoza(c.getString(5));
preparate.setModDePreparare(c.getString(6));
preparat.add(preparate);
}while (c.moveToNext());
}
return preparat;
}
Pentru a introduce informat ¸ii ˆın baza de date am folosit un fis ¸ier de tipul JSON. Am ales
acest format de a stoca informat ¸iile ˆın baza de date deoarece este un mod prin care aplicat ¸ia
nu va necesita conexiune la internet fis ¸ierul fiind salvat ˆın APK-ul aplicat ¸iei.
27

Solut ¸ia propus ˘a Implementare
3.2.2 Activit ˘at ¸i
O activitate reprezint ˘a o fereastr ˘a cu o interfat ¸ ˘a de utilizator. ˆIn aplicat ¸ia KitchenAid am
implementat fiecare activitate ca fiind o clas ˘a care extinde AppCompatActivity. Astfel, Ap-
pCompatActivity devine o superclas ˘a, iar activitatea creat ˘a de c ˘atre mine va prelua toate
metodele superclasei.
ˆIn acest subcapitol voi prezenta mai am ˘anunt ¸it subclasa MainActivity care extinde AppCom-
patActivity, dar ˆın aplicat ¸ia KitchenAid am implementat s ¸i alte subclase care extind aceast ˘a
superclas ˘a, cˆateva dintre acestea fiind: AllPreparateWindow, CaloriiWindow, CategoriiWin-
dow.
MainActivity
MainActivity este o clasa public ˘a.ˆIn aceasta am folosit metoda onCreate() preluat ˘a din
AppCompatActivity. ˆIn aceast ˘a metod ˘a se seteaz ˘a layout-ul activit ˘at ¸ii folosind setCon-
tentView(R.layout.activity main) .R.layout.activity main se refer ˘a la un layout care se afl ˘a
ˆın folderul res/layout, ˆın acest folder afl ˆandu-se toate fis ¸ierele pe care le-am implementat cu
ajutorul XML-ului s ¸i care reprezint ˘a interfet ¸e.
ˆIn codul prezentat mai jos am ales s ˘a prezint init ¸ializarea unui buton ( Button btnPreparate )
s ¸i punerea ˆın funct ¸iune a acestuia. Prin linia urm ˘atoare de cod
btnPreparate = findViewById(R.id.btn preparate) ,
am legat, cu ajutorul id-ului, butonul pe care l-am creat de butonul din layout-ul activity main
numit btn preparate. Acestuia i-am creat un eveniment cu ajutorul c ˘aruia am facut ca butonul
s˘a funct ¸ioneze atunci c ˆand este ap ˘asat. ˆIn momentul ˆın care butonul este ap ˘asat, se va crea
un obiect de tip Intent cu ajutorul c ˘aruia voi stoca informat ¸ii pe care le voi putea prelua ˆın
alte activit ˘at ¸i. De asemenea, ˆın cazul prezentat mai jos, ˆıi voi ad ˘auga Intentului un string cu
ajutorul c ˘aruia voi s ¸ti ce trebuie afis ¸at ˆın interfat ¸a care se va deschide.
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button btnPreparate;
btnPreparate = findViewById(R.id.btn_preparate);
btnPreparate.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
Intent intent = new Intent(getApplicationContext(),
AllPreparateWindow.class);
intent.putExtra("name", "all");
startActivity(intent);
}
});
28

Capitolul 4
Prezentarea aplicat ¸iei
4.1 Pagina principala
ˆIn momentul lans ˘arii aplicat ¸iei, utilizatorul va vedea c ˆateva dintre lucrurile pe care aplicat ¸ia
le poate face. De exemplu, acestuia ˆıi va fi prezentat un c ˆamp care poate fi completat, unde
esteˆıntrebat ce ret ¸et ˘a dores ¸te s ˘a g˘ateasc ˘a. Dup ˘a ce completeaz ˘a acest c ˆamp, dac ˘a dores ¸te s ˘a
foloseasc ˘a acest tip de c ˘autare, va trebui s ˘a apese un buton pentru a se efectua c ˘autarea. ˆIn
caz contrar, utilizatorul poate alege s ˘aˆıi fie afis ¸ate toate ret ¸etele stocate ˆın aplicat ¸ie, s ˘aˆıi fie
afis ¸ate categorii de ret ¸ete sau s ˘aˆıi fie afis ¸ate mai multe tipuri de c ˘aut˘ari.
Figura 4.1 : Pagina principala
29

Prezentarea aplicat ¸iei C ˘autare dup ˘a ingredient
4.2 C ˘autare dup ˘a ingredient
Dac˘a utilizatorul a ales c ˘autarea unei ret ¸ete ˆın pagina principal ˘a, dar nu a introdus nimic ˆın
cˆampul ˆın care ar trebui s ˘a completeze numele acesteia, aplicat ¸ia va r ˘aspunde cu un mesaj
de eroare. ˆIn cazul ˆın care preparatul pe care utilizatorul l-a ales nu exist ˘a, aplicat ¸ia va afis ¸a
un mesaj corespunz ˘ator.
Figura 4.2 : Erori pentru c ˘autarea unui ingredient
ˆIn cazul ˆın care utilizatorul introduce o ret ¸et ˘a care exist ˘aˆın baza de date a aplicat ¸iei, se va
deschide o nou ˘a fereastr ˘aˆın care se va afis ¸a rezultatul c ˘aut˘arii.
30

Prezentarea aplicat ¸iei Vizualizare ret ¸ete
Figura 4.3 : C˘autare dupa numele ret ¸etei
Dup˘a ce a fost g ˘asit s ¸i afis ¸at, dac ˘a utilizatorul va da click pe orice parte afis ¸at ˘a din ret ¸et ˘a se
vor afis ¸a detaliile acelui preparat. Acest lucru se va ˆıntˆampla de fiecare dat ˘a cˆand un utilizator
va da click pe orice parte din orice ret ¸et ˘a afis ¸at ˘a.
Figura 4.4 : Detaliile ret ¸etei
4.3 Vizualizare ret ¸ete
Dac˘a utilizatorul alege s ˘a vizualizeze toate ret ¸etele, se va deschide o pagin ˘a nou ˘a de tip
recyclerview unde sunt afis ¸ate acestea. Pentru fiecare preparat am ales s ˘a expun doar an-
31

Prezentarea aplicat ¸iei Vizualizare categorii
umite caracteristici s ¸i anume: numele preparatului, timpul necesar prepar ˘arii s ¸i o imagine
caracteristic ˘a pentru acesta.
Figura 4.5 : Afis ¸are ret ¸ete
4.4 Vizualizare categorii
ˆIn cazul ˆın care utilizatorul va ap ˘asa butonul numit categorii, aplicat ¸ia va deschide o fereastr ˘a
nou˘aˆın care vor fi afis ¸ate categoriile, spre exemplu cin ˘a, prˆanz sau desert. ˆIn aceast ˘a fereastr ˘a
utlizatorul va fii ˆıntˆampinat de un mesaj reprezentativ pentru aceasta pagin ˘a s ¸i anume ”Din
ce categorie at ¸i dori s ˘a fie ret ¸eta?”. Apoi acesta are posibilitatea de a alege categoria pe care
o prefer ˘a.
32

Prezentarea aplicat ¸iei Vizualizare categorii
Figura 4.6 : Vizualizare categorii
4.4.1 Alegerea categoriei
Dup˘a ce utilizatorul alege o categorie, se deschide o fereastr ˘a nou ˘aˆın care sunt afis ¸ate toate
preparatele care apart ¸in de acea categorie. Ret ¸etele vor fii afis ¸ate sub forma unei liste. Pentru
fiecare preparat va ap ˘area numele acestuia, timpul de preparare necesar si o poz ˘a reprezen-
tativ˘a.
33

Prezentarea aplicat ¸iei Informat ¸ii nutrit ¸ionale
Figura 4.7 : Afia ¸rea ret ¸etelor care apart ¸in de o categorie
4.5 Informat ¸ii nutrit ¸ionale
ˆIn acest capitol voi prezenta toate c ˘aut˘arile pe care aplicat ¸ia KitchenAid le poate realiza ˆın
funct ¸ie de informat ¸iile nutrit ¸ionale ale preparatelor.
Utilizatorul poate sa aleag ˘a una dintre informat ¸iile pe care le voi prezenta ˆın poza atas ¸at ˘a mai
jos. Dupa ap ˘asarea pe oricare dintre acestea se va deschide o pagin ˘a nou ˘a unde se vor afis ¸a
preparatele care ˆıntocmesc cerint ¸ele conform butoanelor sau se va afiss ¸a o fereastr ˘a unde vor
fii cerute date adit ¸ionale.
34

Prezentarea aplicat ¸iei Informat ¸ii nutrit ¸ionale
Figura 4.8 : Informat ¸ii nutrit ¸ionale
4.5.1 Preparate care nu cont ¸in gluten sau lactoz ˘a
ˆIn cazul ˆın care utilizatorul va dori afis ¸area preparatelor care nu cont ¸in gluten sau lactoz ˘a,
pagina care se va deschide va fii sub forma unei list ˘a de preparate care ˆıntocmesc alegerea
utilizatorului.
35

Prezentarea aplicat ¸iei Informat ¸ii nutrit ¸ionale
Figura 4.9 : List ˘a preparate care nu cont ¸in lactoz ˘a
4.5.2 C ˘autare ˆın funct ¸ie de ingredient
ˆIn momentul ˆın care va fii aleas ˘a c˘autarea dupa ingredient, va fii afis ¸at ˘a o pagin ˘a unde uti-
lizatorul va avea posibilitatea de a completa numele ingredientului dorit.
Dac˘a nu este completat c ˆampul ingredientului, se va afis ¸a un mesaj de eroare, la fel se va
ˆıntˆampla s ¸i ˆın cazul ˆın care ingredientul c ˘autat nu exist ˘aˆın compozit ¸ia niciunui preparat.
36

Prezentarea aplicat ¸iei Informat ¸ii nutrit ¸ionale
Figura 4.10 : Erori pentru c ˘autarea unui ingredient
Dac˘a va fii introdus un ingredient care exist ˘aˆın compozit ¸ia unei ret ¸ete, sub c ˆampul ˆın care
este introdus acesta, vor fii afis ¸ate toate preparatele care cont ¸in acel ingredient.
37

Prezentarea aplicat ¸iei Informat ¸ii nutrit ¸ionale
Figura 4.11 : Preparatele care cont ¸in ingredientul c ˘autat
4.5.3 C ˘autarea ˆın funct ¸ie de calorii
ˆIn cazul ˆın care utilizatorul va alege s ˘a caute preparate ˆın funct ¸ie de caloriile cont ¸inute de
acesta, se va deschide o fereastr ˘a care va cont ¸ine dou ˘a cˆampuri ˆın care va fi introdus ˘a valoarea
maxim ˘a sau minim ˘a de calorii, iar dac ˘a sunt introduse ambele valori se va produce o c ˘autare
ˆıntre cele dou ˘a valori.
Dac˘a utilizatorul nu va introduce nicio valoare ˆın niciunul dintre cele dou ˘a cˆampuri sau
valorile introduse nu corespund preparatelor existente ˆın baza de date, aplicat ¸ia va r ˘aspunde
cu mesaje de eroare corespunz ˘atoare.
38

Prezentarea aplicat ¸iei Informat ¸ii nutrit ¸ionale
Figura 4.12 : Erori existente ˆın cazul c ˘aut˘ariiˆın funct ¸ie de calorii
De asemenea dac ˘a utilizatorul va alege ca valoarea introdus ˘aˆın cˆampul cu mesajul ”Mai
multe calorii dec ˆat” s ˘a fie mai mare dec ˆat valoarea din c ˆampul ”Mai put ¸ine calorii dec ˆat”
atunci va ap ˘area un mesaj de eroare corespunz ˘ator.
39

Prezentarea aplicat ¸iei Informat ¸ii nutrit ¸ionale
Figura 4.13 : Eroare valori eronate
ˆIn cazul ˆın care utilizatorul alege s ˘a completeze doar primul c ˆamp s ¸i anume ”Mai multe
calorii dec ˆat” atunci vor fi afis ¸ate doar preparatele care cont ¸in mai multe calorii dec ˆat val-
oarea introdus ˘a. Acelas ¸i lucru se va ˆıntampla s ¸i atunci c ˆand va fi completat doar c ˆampul
”Mai put ¸ine calorii dec ˆat” cu ment ¸iunea c ˘a vor fi prezentate doar ret ¸etele care ˆındeplinesc
acea condit ¸ie.
Atunci c ˆand utilizatorul completeaz ˘a ambele valori, se va afis ¸a o list ˘a cu preparatele ale c ˘aror
calorii sunt ˆıntre acestea dou ˘a.
40

Prezentarea aplicat ¸iei Informat ¸ii nutrit ¸ionale
Figura 4.14 : Eroare valori eronate
41

Capitolul 5
Concluzii
KitchenAid este o aplicat ¸ie dedicat ˘a iubitorilor de gastronomie. Mi-am propus s ˘a realizez o
unealt ˘a care s ˘a fie de ajutor ˆın g˘a sirea ret ¸etei potrivite. Aceasta este o aplicat ¸ie ce permite
unui utilizator s ˘a vizualizeze o list ˘a de ret ¸ete stocat ˘a de sistem. Utilizatorul va putea c ˘auta
anumite ret ¸ete dup ˘a diferite filtre, filtrele ajut ˆandu-l pe acesta s ˘a g˘aseasc ˘a o ret ¸et ˘a potrivit ˘a
pentru obiceiurile sale alimentare, dietele t ¸inute de acesta, sau chiar momentul zilei ˆın care
ret ¸eta va fi preg ˘atit˘a.
Astfel am realizat o aplicat ¸ie pe care o voi folosi pe parcurs ce voi ˆınv˘aa ¸ s˘a g˘atesc c ˆat mai
multe preparate.
5.1 Direct ¸ii viitoare de lucru
Pe viitor, voi avea ˆın vedere continuarea s ¸i ˆımbun ˘at˘at ¸irea aplicat ¸iei. Pentru moment am
considerat o provocare realizarea bazei de date, astfel am trecut prin mai multe etape ale
dezvolt ˘arii unei aplicat ¸ii, dar voi avea ˆın vedere integrarea Edamam Recipe API [19], aceasta
cont ¸in ˆand o baz ˘a de date cu ret ¸ete foarte mare.
De asemenea, ma g ˆandesc, ca dupa ce voi face schimbarea ment ¸ionat ˘a anterior, s ˘a dau
aplicat ¸ia spre testare ˆın ideea realiz ˘arii unui studiu de uzabilitates. Astfel buc ˘atarii experimentat ¸i
sau novice o vor putea folosi, s ¸i m ˘a vor ajuta ˆın cazul ˆın care vor avea sugestii pentru a face
aplicat ¸ia din ce ˆın mai bun ˘a.
42

Referint ¸e bibliografice
[1]https://play.google.com/store/apps/details?id=com.mufumbo.android.recipe.search .
[2]https://play.google.com/store/apps/details?id=com.craftlog.android.cookinghl=ro .
[3]https://play.google.com/store/apps/details?id=com.yummly.android .
[4]https://www.marthastewart.com/ .
[5]https://www.jamieoliver.com/ .
[6]https://developer.android.com/studio/intro/ .
[7]https://java.com/en/download/faq/whatis java.xml .
[8]https://www.thoughtco.com/what-is-java-2034117 .
[9]https://www.androidauthority.com/history-android-os-name-789433/ .
[10] http://www.scientia.ro/stiinta-la-minut/istoria-ideilor-si-descoperirilor-
stiintifice/6896-sistemul-de-operare-android-scurt-istoric.html .
[11] Gerber Adam Craig Clifton. Learn android studio build android apps quickly and ef-
fectively. https://www.apress.com/gp/book/9781430266013 , 2015.
[12] https://www.sqlite.org/about.html .
[13] https://www.sqlite.org/crew.html .
[14] Sunny Kumar Aditya and Vikash Kumar Karn. Android sqlite essentials.
https://www.packtpub.com/application-development/android-sqlite-essentials , 2014.
[15] Cristian Frasinaru. Curs practic de java. 2010.
[16] https://www.youtube.com/watch?v=jQzO1xjkb0E .
[17] http://users.jyu.fi/ airi/xmlfamily.html .
[18] https://www.json.org/json-ro.html .
[19] https://developer.edamam.com/ .
43

Similar Posts

  • Licență Variantă Finalădocx 1 [629730]

    UNIVERSITATEA DE MEDICINĂ ȘI FARMACIE ”VICTORBABEȘ” DIN TIMIȘOARAFACULTATEA MEDICINĂ GENERALĂDEPARTAMENTUL DE ȘTIINȚE FUNCȚIONALEDISCIPLINA DE INFORMATICĂ ȘI BIOSTATISTICĂ MEDICALĂ ROMAN S. DEIANA SORINA LUCRARE DE LICENȚĂConducător ȘtiințificTimar Bogdan T I M I Ș O A R A2 0 1 7​ UMFVBTFACULTATEA MEDICINĂ GENERALĂDepartamentul de Științe FuncționaleDisciplina Informatică și Biostatistică Medicală ROMAN DEIANA SORINA LUCRARE DE LICENȚĂImpactul…

  • – Lucrare de licențĂ [303704]

    [anonimizat] – Brăila PROGRAMUL DE STUDII: [anonimizat] – Conducător științific: Conf. univ. dr. SILVIU NICULCEA Absolvent: [anonimizat] 2020 – CUPRINS: CAPITOLUL I ASIGURĂRILE FORMĂ DE PROTECȚIE ÎMPOTRIVA RISCURILOR I.1. Conceptul de asigurare si necesitatea acesteia. Funcțiile asigurării…………3 I.2. Clasificarea asigurărilor…………………………………………………………………..6 I.3. Reasigurarea. Funcțiile reasigurării…………………………………………………..8 I.4. Risc și șansă…………………………………………………………………………………10 CAPITOLUL II PIAȚA DE ASIGURĂRI II.1. Piața…

  • Drept e perpendiculare [609527]

    SILABUS DE CURS  Informații generale Date de contact ale titularului de curs: Nume: Lect. Dr. Ioana MAGDAȘ Birou: Str. Sind icatelor, nr 7 Telefon: 064-597000 Fax: E-mail: [anonimizat] Consultații: se stabilesc la începutul semestrului Date de identificare curs și contact tutori: Numele cursului : METODICA PREDĂRII MATEMATICII Codul cursului: PIE 3505 Anul, semestrul: Studenții…

  • Asistență socială în cadrul Serviciilor Medicale de Urgență [612952]

    Universitatea ,,Babeș -Bolyai”Cluj Napoca Facultatea de Sociologie și Asistență Socială Secția de Asistență Socială Asistență socială în cadrul Serviciilor Medicale de Urgență Coordonator științific: Lect. Univ. Dr. Eugen Băican Asistent social: Peter Andrei Student: [anonimizat] 1 1. Precizări introductive ……………………………………………………………………………………………………………. 1 1.1 Motivația personală pentru alegerea temei …………………………………………………………………………… 1 2. Nevoia de servicii sociale …………………………………………………………………………………………………………

  • Specializarea Controlul și Expertiza Produselor Alimentare [623264]

    Universitatea „Lucian Blaga” din Sibiu Facultatea de Științe Agricole Industrie Alimentară și Protecția Mediului Specializarea Controlul și Expertiza Produselor Alimentare PROIECT DE DIPLOM Ă Coordonator Student: [anonimizat] g. Monica MIRONESCU Cosmin Moisică LUPULEȚ Ș.L. Dr. ing. Ion Dan MIRONESCU Sibiu 2015 Universitatea „Lucian Blaga” din Sibiu Facultatea de Științe Agricole Industrie Alimentară și Protecția Mediului…

  • Fabricarea de substraturi fibroase cu efect [613972]

    Fabricarea de substraturi fibroase cu efect antiinflamator ob ținute prin electrofilare Absolvent: [anonimizat]. Georgiana -Dana Dumitrescu Coordonatori științifici : Prof. Dr.Ing. Izabela -Cristina Stancu Ș.l.Dr.Ing. Diana -Maria Drăgușin Žakman Universitatea POLITEHNICA din București Facultatea de Chimie Aplicată și Știința Materialelor Master: Știința și Ingineria Polimerilor 2 Cuprins I. REFERAT DE LITERATURĂ ………………………….. ………………………….. ………………………….. …………………….