Sunteți pe pagina 1din 7

1.

Stocarea, extragerea, procesarea și prezentarea datelor

1.1. Memoria internă


Memoria internă este destinată stocării datelor prin intermediul unei aplicații Android, adică
putem considera că memoria internă este memoria primară a dispozitivului mobil propriu.
Reținem că datele – informația se stochează într-un fișier specificat de utilizator, însă utilizatorul
nu are acces la fișierul cu date, decât prin implicarea aplicației respective.
Să punctăm anumite lucruri importante:
 În memoria internă datele pot fi scrise, precurm și citite.
 Important: Fișierele / datele stocate în memoria internă pot fi accesate doar de aplicația
care le-a înscris nu și de alte aplicații;
 Datele/fișierele corespunzătoare unei aplicații există în memorie doar atât cât există și
aplicația care le-a format, la momentul dezinstalării aplicației, fișierele corespunzătoare
se elimină în mod automatizat.
 Fișierele se stochează în directoriul data / data urmat de numele pachetului (package)
aplicației;
 Utilizatorul poate acorda în mod explicit permisiunea altor aplicații de a accesa aceste
fișiere;
 Pentru a asigura ca datele să fie private, se poate utiliza opțiunea MODE_PRIVATE;
 Cea mai potrivită modalitate de a folosi memoria internă este atunci când datele pot fi
accesate doar de către aplicația corespunzătoare, accesul fiind interzis atât utilizatorului
cât și din cadrul altor aplicații.
Opțiuni de stocare internă:
 MODE_PRIVATE — În modul privat, datele stocate anterior sunt întotdeauna
suprascrise de datele curente, adică de fiecare dată când încercăm să scriem o nouă
scriere într-un fișier, datele se elimină sau suprascriu conținutul anterior.
 MODE_APPEND — în acest mod, datele sunt atașate la conținutul existent, adică
continuăm să adăugăm date.
Pentru informare cu mai multe detalii recomandăm pentru mai multe detalii
consultați sursele[12,13].

În continuare, imediat mai jos, prezentăm un fragment – exemplu de cod pentru


înscriere în memoria internă și externă.
Creăm o aplicație nouă, pornind cu opțiunea Empty Activity și adaptăm codul inițiat în mod
automat prin modificările respective pentru a avea MainActivity cu liniile de cod prezentate
imediat mai jos:

public class MainActivity extends AppCompatActivity {


private static final String TAG = "Sdcard";
private TextView tv; String FileN="INF_Aplic.txt";
Context MyContext;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = (TextView) findViewById(R.id.textView2);
WriteIntern();
ReadIntern();
}
}

Atenție, este necesar să includeți activity_main.xml un element de tip TextView (cu id –


urile respective, analizați layout – ul de la Calculator)
Mai jos avem lin de cod iilepentru metodele WriteIntern();ReadIntern();.
Textele respective le inserăm în locurile potrivite în MainActivity, după metoda onCreate.

private void WriteIntern()


{
String File_Name= "Proba.txt"; //gives file name
String MyInfo="Success Internal Write info!"; //define data
File dir = new File(this.getFilesDir(), "mydir");
if(!dir.exists()){dir.mkdir();}
try {
File mf = new File(dir, File_Name);
FileWriter writer = new FileWriter(mf);
writer.append(MyInfo);
writer.flush();
writer.close();
tv.append("\nSucces: " +
" WRITE_Internal_STORAGE,Success Internal Write
info! ");
writer.close();
}
catch(Exception e){
tv.append("\nProblems: " +" WRITE_Internal_STORAGE ");
}

private void ReadIntern()


{ String File_Name= "Proba.txt"; //gives file name
String MyInfo="Success Internal Write info!"; //define data
File dir = new File(this.getFilesDir(), "mydir");
if(!dir.exists()){ dir.mkdir(); }
try {
File mf = new File(dir, File_Name);
BufferedReader br = new BufferedReader(new
FileReader(mf));
tv.append(br.readLine());
tv.append("\nSucces: " +
"read_Internal_STORAGE,Success Internal read info! ");
br.close();
}
catch(Exception e){
tv.append("\nProblems: " +" Read_Internal_STORAGE ");
Log.i(TAG, "Problems: " +
" Read_Internal_STORAGE ");
}
}
Remarcă: ”Răsfoind” în Internet referitor la implicarea memoriei, putem găsi destul de
multe și diverse abordări pentru utilizarea acesteia.

1.2. Memoria externă


O alternativă utilizării memoriei interne este memoria externă. Memoria externă poate fi
considerată ca memorie secundară, pe cardul SD al telefonului mobil. Datele se stochează într-un
fișier specificat de utilizator, astfel ca însuși utilizatorul poate și accesa aceste fișiere. Asemenea
fișiere sunt accesibile numai până când aplicația se închide sau până când aveți un card SD
montat pe dispozitiv.
Important: Pentru a obține posibilitatea de a stoca date în memoria externă este necesară
permisiunea de citire sau / și scriere. Prin urmare, este necesar să adăugăm în fișierul Manifest
Android liniile de cod respective de obține acces la asemenea fișiere

<uses-permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission
android:name="android.permission.READ_EXTERNAL_STORAGE" />

Pentru a evita blocarea aplicației, este necesar să verificați în prealabil dacă cardul SD de
stocare este disponibil pentru operațiuni de citire sau / și scriere. Metoda
getExternalStorageState() este folosită pentru a determina starea suportului de
stocare, adică dacă cardul SD este montat, este citibil, este inscriptibil etc.
Imediat mai jos, prezentăm un fragment de cod care ne asigură o verificare a accesului la
memoria externă

private void checkExternalMedia(){


boolean mExternalStorageAvailable = false;
boolean mExternalStorageWriteable = false;
String state = Environment.getExternalStorageState();
if (Environment.MEDIA_MOUNTED.equals(state)) {
// Can read and write the media
mExternalStorageAvailable = mExternalStorageWriteable =
true;
} else if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state))
{
// Can only read the media
mExternalStorageAvailable = true;
mExternalStorageWriteable = false;
} else {
// Can't read or write
mExternalStorageAvailable = mExternalStorageWriteable =
false;
}
tv.append("\n\nExternal Media: readable="
+mExternalStorageAvailable+"
writable="+mExternalStorageWriteable);
}

Fragmentul de cod de mai jos poate fi utilizat în scopul de a scrie datele într-un fișier în
memoria externă, pe cardul SD. Funcționalitatea liniilor de cod este exprimată destul de explicit
prin esența cuvintelor cheie.

private void writeToSDFile(){


File root =
android.os.Environment.getExternalStorageDirectory();
tv.append("\nExternal file system root: "+root);
File dir = new File (root.getAbsolutePath() + "/download");
dir.mkdirs();
File file = new File(dir, FileN);
try {
FileOutputStream f = new FileOutputStream(file);
PrintWriter pw = new PrintWriter(f);
pw.write("\nPrId, PrN, Price, Quant, Date");
pw.write("\n1, PrN1, 2, 5, 24/02/18");
pw.write("\n2, PrN2, 4, 6, 24/02/18");
pw.flush();
pw.close();
f.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
Log.i(TAG, "File not found. Did you" +
" add a WRITE_EXTERNAL_STORAGE permission to the manifest?");
} catch (IOException e) {
e.printStackTrace();
}
tv.append("\n\nFile written to:\n"+file);
}
În mod analog se poate organiza și operația de citii de pe cardul SD (imediat mai jos
găsim fragmentul de cod respectiv)
public void readSDFile()
{ // read from SD card file data in the text box
String aDataRow = "";
String aBuffer = "";
String [] ss;
try {
File myFile = new File("/mnt/sdcard/download/"+FileN);
FileInputStream fIn = new FileInputStream(myFile);
BufferedReader myReader = new BufferedReader(
new InputStreamReader(fIn));
while ((aDataRow = myReader.readLine()) != null) {
aBuffer += aDataRow + "\n";
}
tv.append("\n"+aBuffer);
myReader.close();
Toast.makeText(getBaseContext(),
"Done reading SD 'IA181.txt'"+aBuffer,
Toast.LENGTH_SHORT).show();
} catch (Exception e) {
Toast.makeText(getBaseContext(), e.getMessage(),
Toast.LENGTH_SHORT).show();
}

}
Având introduse în proiectul aplicației liniile de cod prezentate mai sus, inserăm în metoda
onCreate apelurile checkExternalMedia(); writeToSDFile();
readSDFile(); apoi lansăm aplicația și ar trebui să obținem pe ecran imaginea din figura
2.1

Exerciții:
Folosind în calitate de model aplicația dezvoltată în baza liniilor de cod în cadrul activităților
practice-laborator anterioare, efectuați modificările necesare pentru a include în aplicație
soluționarea următoarelor sarcini:
1. Să se înscrie într-un fișier în memoria internă câteva valori de tip string conform
modelului "1, PrN1, 2, 5, 24/02/18" (primul rând să fie în formatul
"PrId,PrN,Price,Quant,Date";
2. Tot acolo, în continuare, în cadrul aceleași aplicații, adăugați liniile de cod care asigură
citirea informației scrise în cadrul punctului 1. și să se afișeze pe ecran (fiecare rând citit să
fie afișat într-un rând separat pe ecranul telefonului);
Este necesar să studiem cu
atenție toate liniile de cod
prezentate în secvențele de
cod, inclusiv și modul de
utilizare a metodelor.
Atragem atenția și la
structura try catch – ca
fiind o modalitate de a
organiza o monitorizare a
procesului de testare, precum
și de ocolire a unor erori
neprevăzute.

Figura 2.1 Operații de scriere și citire (memoria Internă și Externă)

3. De îndeplinit sarcinile 1.,2. Folosind memoria externă.


4. Creați câte o metodă separată pentru îndeplinirea operațiilor de înscriere și citire în memoria
internă și externă, apoi implicați aceste metode pentru îndeplinirea sarcinilor formulate în
punctele 1.2.3.;
5. Al patrulea element din fiecare câmp (coloană) exprimă o valoare numerică pentru Quant:
calculați cantitatea totală înregistrată în datele din fișier;
6. Având deja fișierul cu date completate conform îndeplinirii sarcinii din p 3., divizați acel
fișier în două părți: într-un fișier să se înscrie toate rândurile cu valoarea Quant mai mare
decât o valoare dată, iar restul să fie înscrise în alt fișier (să se prevadă ca valoarea dată să
fie preluată dintr-un element de tip EditText).
7. Pentru îndeplinirea sarcinii 6. creați o metodă cu cel puțin doi parametri și utilizați-o)
8. Deschideți aplicația MS office Excel, pe o foaie (Sheet), în primul rînd, în colțul stînga sus,
completați pe orizontală valorile: PrId, PrN, Price, Quant, Date (acesta va fi antetul
tabelului).
9. Completați tabelul pe verticală, vreo 25 rânduri. Fiecare rând din tabel trebuie să conțină
date informații, conform modelului: 1,Prod1,2,4,23/02/22, date care reprezintă valorile
corespunzătoare denumirilor coloanelor din antet. Valorile din coloana 1 trebuie să doar
valorile de la 1, ..., 5 (corespunzător Prod1, ... ,Prod5). Valorile din coloana Price pentru
produsul Prodi trebuie să fie aceeași pentru aceeași valoare i. Valorile din coloana Quant –
oricare, de pe intervalul numeric (1,10). Componenta zilei din coloana Date să una dintre
valorile de pe intervalul (23,27).
10. Copiați tabelul, plasați-l într-u fișier de tip TXT,apoi salvați-l pe calculatorul D-tră.
Efectuați operațiile corespunzătoare pentru a plasa acest fișier în mapa
mnt/sdcard/download în cadrul dispozitivului virtual.
11. Având o metodă care citește doar rândul curent dintr-un fișier de tip TXT (dacă nu aveți o
asemenea metodă,atunci creați-o), foloșiți-o pentru a plasa informația din fișierul recent
creat în mnt/sdcard/download în două elemente EditText aranjate într-o linie pe
orizontală: în EditText –ul din stânga să fie rândurile cu valoarea Quant mai mare decât o
valoare dintr-un EditText în prealabil creat, iar în EditText -ul din dreapta să fie plasate
celelalte rânduri.
12. Deasupra EditText – urilor completate plasați comentariu scurt referitor la conținutul
EditText – ului respectiv.
13. Creați o metodă care calculează costul total (Price*Quant) al produselor dintr-un tabel
plasat într-un EditText crteat de Dtră în cadrul îndeplinirii sarcinii din p.4, apoi folosiți-o
pentru a determina în care EditText costul este mai mare. Răspunsul trebuie plasat într-un
TextView cu comentariul respectiv.

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