Platforma Android oferă o gamă largă de opțiuni de stocare pentru utilizarea în aplicațiile dvs. În această serie de tutori, vom explora unele dintre facilitățile de stocare a datelor furnizate de SDK-ul Android construind un proiect simplu: un editor de artă ASCII.
Aceasta este ultima parte dintr-o serie de tutori despre crearea unei aplicații editor de artă ASCII pentru Android. În primele trei părți, am creat interfața cu utilizatorul, am realizat salvarea imaginilor utilizator ASCII ca fișiere de imagine și am creat o bază de date pentru stocarea fotografiilor salvate. Aceasta a permis utilizatorilor să aleagă din lista de imagini salvate pentru a le încărca înapoi pentru vizualizare, exportarea și editarea. În acest tutorial, vom facilita salvarea de imagini în baza de date, ștergerea imaginilor salvate anterior și pornirea de noi fotografii.
Această serie de tutori despre crearea unui editor ASCII simplu de artă este în patru părți:
Vom lucra în întregime în clasa principală a activității aplicației de această dată. Adăugați următoarele importuri în partea de sus a clasei:
import java.text.SimpleDateFormat; import java.util.Calendar; importul android.app.AlertDialog; import șiroid.content.ContentValues; import șiroid.content.DialogInterface;
Ne vom ocupa de clicurile pe Salvați, șterge, și nou butoane. În principal onCreate , setați clasa pentru a gestiona clicurile:
Buton saveASCIIBtn = (buton) findViewById (R.id.save_btn); saveASCIIBtn.setOnClickListener (aceasta); Buton newBtn = (buton) findViewById (R.id.new_btn); newBtn.setOnClickListener (aceasta); Butonul deleteBtn = (butonul) findViewById (R.id.delete_btn); deleteBtn.setOnClickListener (aceasta);
Am adăugat aceste butoane în fișierele de dispunere din seria precedentă. În onClick după codul existent, adăugați lanțului de blocuri condiționate pentru aceste trei butoane suplimentare:
// user a făcut clic pe alt buton altceva dacă (v.getId () == R.id.new_btn) // utilizatorul a făcut clic pe butonul de salvare altceva dacă (v.getId () == R.id.save_btn) // utilizatorul a făcut clic pe butonul de ștergere altfel dacă (v.getId () == R.id.delete_btn)
Vom adăuga codul la fiecare dintre aceste blocuri pentru a implementa funcționalitatea.
Să începem cu cea mai ușoară funcție, utilizatorii apăsând pe nou buton. În blocul condițional din onClick pentru nou , resetați câmpul text la un șir gol gata pentru introducerea de către utilizator:
textArea.setText ( "");
Amintiți-vă că am folosit o variabilă pentru a urmări ID-ul imaginii afișate în prezent dacă a fost încărcată din baza de date - resetați și ea:
currentPic = -1;
Să ne întoarcem la blocul condiționat în onClick pentru Salvați buton. Când utilizatorul apasă tasta Salvați buton, există două posibilități. Fie salvează o imagine nouă care nu este încă stocată în baza de date, fie salvează o imagine încărcată din baza de date, apoi editată. Dacă utilizatorul salvează o imagine încărcată din baza de date, în loc să salveze o intrare nouă în baza de date, vom actualiza înregistrarea existentă.
Mai întâi obțineți conținutul Textului de editare:
Stringul a intratTxt = textArea.getText (). ToString ();
Pentru a modela datele pe care dorim să le angajăm în baza de date, fie ca inserție pentru o imagine nouă, fie ca o actualizare pentru o imagine existentă, vom crea un obiect Valori de conținut:
ContentValues picValues = conținut nou ();
Noile date vor include textul din câmpul de text, deci adăugați-l la obiectul Valori de conținut, utilizând numele coloanei de tabel pe care am definit-o ultima dată, stocată ca variabilă publică în clasa de ajutor a bazei de date:
picValues.put (ImageDataHelper.ASCII_COL, enterTxt);
Vom folosi un șir care include data și ora curente pentru numele imaginii, construiți astfel:
Data theDate = Calendar.getInstance (). GetTime (); SimpleDateFormat dateFormat = nou SimpleDateFormat ("yyyy-MM-dd_hh.mm.ss"); String fileName = dataFormat.format (data);
Aceasta este ceea ce utilizatorul va vedea în lista de imagini salvate. Adăugați-o la valorile conținutului utilizând aceeași tehnică:
picValues.put (ImageDataHelper.CREATED_COL, fileName);
Obțineți o referință la baza de date:
SQLiteDatabase salvatPicsDB = imgData.getWritableDatabase ();
Acum trebuie să adaptăm ce se întâmplă dacă imaginea actuală este nouă sau nu. Adăugați o declarație condiționată:
în cazul în care (currentPic<0) else
Variabila va fi mai mică decât zero dacă imaginea curentă nu este deja în baza de date (așa cum l-am setat la -1). Dacă imaginea curentă a fost încărcată din baza de date, această variabilă va avea ID-ul de imagine din baza de date stocată în ea, caz în care altfel va executa. În interiorul dacă bloc, vom salva imaginea ca o nouă bază de date:
long insertNum = salvatPicsDB.insert ("pics", null, picValues);
Aceasta este o instrucțiune insert, deoarece este o înregistrare nouă. Transmitem numele tabelului și valorile conținutului create. Parametrul de mijloc este pentru numele unei coloane, dar nu avem nevoie de el. Returnați rezultatul insertului ca o valoare lungă, care este ID-ul înregistrării nou introduse. Actualizați variabila astfel încât orice modificări noi salvate să fie scrise în aceeași bază de date:
currentPic = (int) insertNum;
Acum trimiteți un mesaj de confirmare utilizatorului, furnizând o inserție reușită:
dacă (insertNum> = 0) Toast.makeText (getApplicationContext (), "Imaginea salvată în baza de date!", Toast.LENGTH_SHORT) .show ();
Acum hai să ne întoarcem la altfel, pentru actualizarea unei imagini deja stocate în baza de date:
int salvatNum = savedPicsDB.update ("pics", picValues, ImageDataHelper.ID_COL + "=?", nou String [] "" + currentPic);
De data aceasta folosim un Actualizați declarație, trecând numele tabelului, Valorile conținutului și Unde Detalii. Unde o parte a instrucțiunii indică coloana ID și valoarea care se potrivește în ea, specificând ID-ul curent al imaginii, astfel încât înregistrarea corectă este actualizată. Metoda așteaptă o matrice de șir pentru ultimul parametru, chiar și atunci când există o singură valoare ca în acest caz. Confirmați actualizarea către utilizator:
dacă (savedNum> 0) Toast.makeText (getApplicationContext (), "Imaginea salvată în baza de date!", Toast.LENGTH_SHORT) .show ();
Actualizăm numele imaginii și conținutul, dar puteți opta să lăsați numele ca o reflecție a momentului când imaginea a fost creată inițial, dacă preferați. După altfel, închideți conexiunile:
savedPicsDB.close (); imgData.close ();
Acum, să implementăm ștergerea imaginii curente. Dacă imaginea curentă a fost încărcată din baza de date, vom șterge înregistrarea. În caz contrar, vom goli câmpul de text. În secțiunea condiționată a onClick pentru butonul de ștergere, adăugați un test pentru aceasta, după cum urmează:
dacă (currentPic> = 0) // imaginea a fost încărcată din baza de date - pentru a confirma utilizatorul altceva // imaginea nu a fost încărcată din baza de date
În dacă secțiunea pe care o vom șterge din baza de date. Mai întâi, utilizatorul trebuie să confirme utilizând un dialog de alertă:
AlertDialog.Builder confirmBuilder = nou AlertDialog.Builder (acest lucru);
Setați mesajul de dialog și starea anulată:
confirmBuilder.setMessage ("Șterge imaginea salvată?"); confirmBuilder.setCancelable (false);
Acum trebuie să specificăm ce ar trebui să se întâmple atunci când utilizatorul alege să continue ștergerea, prin definirea butonului pozitiv:
confirmBuilder.setPositiveButton ("Da", noul dialog DialogInterface.OnClickListener () public void onClick (dialog DialogInterface, int id) );
Aici definim un nou ascultător de clic, împreună cu acesta onClick metodă. În interiorul onClick , putem șterge imaginea salvată - obțineți o conexiune la baza de date:
SQLiteDatabase salvatPicsDB = imgData.getWritableDatabase ();
Acum executați ștergerea:
int deleteResult = salvatPicsDB.delete ("pics", ImageDataHelper.ID_COL + "=?", nou String [] "" + currentPic);
Specificăm numele tabelului, coloana ID și valoarea care se potrivește în ea, astfel încât să ștergem înregistrarea corectă. Dacă ștergerea a avut succes, confirmați utilizatorului:
dacă (deleteResult> 0) Toast.makeText (getApplicationContext (), "Picture deleted", Toast.LENGTH_SHORT) .show ();
Încă în interiorul Interfeței de dialog, faceți clic pe ascultător onClick , resetați variabila ID imagine, goliți câmpul text și închideți conexiunile bazei de date:
currentPic = -1; textArea.setText ( ""); savedPicsDB.close (); imgData.close ();
Acum, după blocul în care ați setat butonul pozitiv, setați butonul negativ:
confirmBuilder.setNegativeButton ("Nu", noul dialog DialogInterface.OnClickListener () public void onClick (dialog DialogInterface, int id) dialog.cancel (););
În acest caz, pur și simplu anulați dialogul. Acum putem merge mai departe și arătăm:
AlertDialog alertă = confirmBuilder.create (); alert.show ();
Acum, completați secțiunea de ștergere a Activității onClick metodă, întoarce-te la tine altfel instrucțiune pentru momentul în care imaginea curentă nu a fost încărcată din baza de date. În acest caz, pur și simplu vom goli textul Editare:
textArea.setText ( "");
Am închis conexiunile bazei de date în fiecare bloc pe care l-am folosit pentru interogarea, inserarea, ștergerea sau actualizarea înregistrărilor. Cu toate acestea, în cazul în care utilizatorul iese din aplicație în timp ce o conexiune este deschisă, trebuie să ne asigurăm că toate conexiunile sunt închise. Adaugă onDestroy la activitatea dvs.:
@Override public void onDestroy ()
În interiorul acestuia, închideți asistenta bazei de date, apoi apelați metoda superclass:
imgData.close (); super.onDestroy ();
Acum vă puteți testa aplicația! Verificați dacă salvează corect fotografii noi, actualizează imaginile existente și șterge fotografiile la solicitarea utilizatorului, salvând câteva persoane, apoi experimentând cu acestea.
Aplicația simplă pentru editorul de artă ASCII este acum completă. Când rulați aplicația, ar trebui să aveți posibilitatea să introduceți caractere text, să salvați imagini, să le exportați ca fișiere imagine, să încărcați, să editați și să ștergeți fotografiile salvate anterior, precum și să configurați culorile afișajului. Descărcarea codului sursă conține toate fișierele Java și XML la care am lucrat în timpul seriei.
Există numeroase moduri în care puteți îmbunătăți această aplicație dacă doriți să o explorați în continuare. De exemplu, puteți îmbunătăți stilul interfeței cu utilizatorul. Puteți verifica dacă utilizatorul dorește să suprascrie o imagine stocată înainte de actualizarea unei înregistrări existente în baza de date, oferindu-i în schimb posibilitatea de a salva o imagine nouă. Un accesoriu deosebit de productiv ar fi extinderea codului pentru a utiliza furnizorii de conținut și / sau fragmente pentru a încărca date și a viza dispozitive tabletă în mod eficient. De asemenea, puteți îmbunătăți procesul de salvare a imaginilor, de exemplu, permițând utilizatorului să aleagă un nume pentru fiecare imagine pe care o salvează.
.