Noțiuni de bază cu Cloud Firestore pentru Android

Cloud Firestore este un plus recent pentru familia de produse Firebase. Deși încă este în versiune beta, este deja prezentat de Google ca o alternativă mai flexibilă și mai bogată în caracteristici la baza de date Firebase Realtime.

Dacă ați folosit vreodată Baza de date Realtime, probabil că știți că este în esență un document JSON mare, care este cel mai potrivit pentru stocarea numai a perechilor de chei simple. Stocarea unor date ierarhice cu privire la aceasta în mod eficient și sigur, deși este posibil, este destul de greoaie și necesită o strategie bine gândită, care implică de obicei aplatizarea datelor cât mai mult posibil sau denormalizarea acesteia. Fără o astfel de strategie, interogările privind baza de date în timp real sunt susceptibile de a consuma sume inutil de mari de lățime de bandă.

Cloud Firestore, fiind mai asemănătoare cu bazele de date orientate spre documente, cum ar fi MongoDB și CouchDB, nu are astfel de probleme. În plus, acesta vine cu un număr mare de caracteristici foarte utile, cum ar fi suport pentru operații lot, scrieri atomice și interogări indexate.

În acest tutorial, vă ajut să începeți să utilizați Cloud Firestore pe platforma Android.

Cerințe preliminare

Pentru a putea urma acest tutorial, veți avea nevoie de:

  • cea mai recentă versiune de Android Studio
  • un cont Firebase
  • și un dispozitiv sau emulator care rulează Android 4.4 sau o versiune ulterioară

1. Crearea unui proiect Firebase

Înainte de a utiliza produsele Firebase în aplicația Android, trebuie să creați un nou proiect pentru acesta în consola Firebase. Pentru a face acest lucru, conectați-vă la consola și apăsați pe Adăugați un proiect pe ecranul de întâmpinare.

În dialogul care apare, dați un nume semnificativ proiectului, dați-i opțional un ID semnificativ și apăsați pe Creați un proiect buton.

Odată ce proiectul a fost creat, puteți seta Firestore ca bază de date prin navigarea la Dezvoltați> Baza de date și apăsând tasta Încercați Firestore Beta buton.

În ecranul următor, asigurați-vă că alegeți Începeți în modul de testare și apăsați butonul Permite buton.

În acest moment, veți avea o bază de date Firestore goală, toate pregătite pentru a fi utilizate în aplicația dvs..

2. Configurarea Proiectului Android

Proiectul dvs. Android Studio încă nu știe nimic despre proiectul Firebase pe care l-ați creat în etapa anterioară. Cea mai ușoară modalitate de a stabili o conexiune între cele două este să utilizați Firebase Assistant pentru Android Studio.

Mergi la Instrumente> Firebase pentru a deschide asistentul.

Deoarece Firestore este încă în versiune beta, Asistentul nu o acceptă încă. Cu toate acestea, prin adăugarea Firebase Analytics la aplicația dvs., veți putea automatiza majoritatea pașilor de configurare necesari.

Începeți făcând clic pe Conectați un eveniment Google Analytics link în cadrul Google Analytics și apăsați pe Conectați-vă la Firebase buton. O fereastră nouă de browser ar trebui să apară acum, întrebându-vă dacă doriți să permiteți ca Android Studio să gestioneze, printre altele, datele Firebase.

apasă pe Permite pentru a continua.

Înapoi în Android Studio, în dialogul care apare, selectați Alegeți un Firebase sau un proiect Google existent selectați proiectul Firebase pe care l-ați creat mai devreme și apăsați pe Conectați-vă la Firebase buton.

Apoi, apăsați pe Adăugați Google Analytics la aplicația dvs. pentru a adăuga dependențele de bază Firebase la proiectul dvs..

În cele din urmă, pentru a adăuga Firestore ca un punerea în aplicare dependență, adăugați următoarea linie în aplicaţia ale modulului build.gradle fişier:

implementare "com.google.firebase: firebase-firestore: 11.8.0 '

Nu uitați să apăsați pe Sincronizați acum pentru a finaliza configurația. Dacă întâmpinați erori de conflict de versiune în timpul procesului de sincronizare, asigurați-vă că versiunile dependenței Firestore și dependența Firebase Core sunt identice și încercați din nou.

3. Înțelegerea documentelor și a colecțiilor

Firestore este o bază de date NoSQL care vă permite să stocați date sub formă de documente asemănătoare JSON. Cu toate acestea, un document stocat pe acesta nu poate exista independent. Trebuie să aparțină întotdeauna unei colecții. După cum sugerează și numele, o colecție nu este altceva decât o grămadă de documente. 

Documentele dintr-o colecție sunt evident frați. Dacă doriți să stabiliți relații părinte-copil între ele, trebuie să utilizați subcollecții. O subcolulare este doar o colecție care aparține unui document. În mod implicit, un document devine automat părinte pentru toate documentele care aparțin subcolecțiilor sale.

De asemenea, merită remarcat faptul că Firestore gestionează singură crearea și ștergerea atât a colecțiilor, cât și a subcololecțiilor. Ori de câte ori încercați să adăugați un document la o colecție inexistentă, acesta creează colecția. În mod similar, odată ce ștergeți toate documentele dintr-o colecție, aceasta se șterge.

4. Crearea de documente

Pentru a putea să scrieți în baza de date Firestore din aplicația dvs. Android, trebuie mai întâi să primiți o referință la aceasta apelând getInstance () metodă a FirebaseFirestore clasă.

val myDB = FirebaseFirestore.getInstance ()

Apoi, trebuie fie să creați o colecție nouă, fie să obțineți o referință la o colecție existentă, sunând la Colectie() metodă. De exemplu, într-o bază de date goală, următorul cod creează o nouă colecție numită sistem solar:

val solarSystem = myDB.collection ("solar_system")

Odată ce ați făcut referire la o colecție, puteți începe să adăugați documente la ea, sunând la ea adăuga() care se așteaptă ca o hartă ca argument.

// Adăugați un document solarSystem.add (mapOf ("nume" la "Mercur", "număr" la 1, "gravitate" la 3.7)) // Adăugați un alt document solarSystem.add (mapOf (" , "număr" până la 2, "gravitate" până la 8,87))

adăuga() metoda generează automat și atribuie un identificator alfanumeric unic fiecărui document pe care îl creează. Dacă doriți ca documentele dvs. să aibă în schimb propriile coduri personalizate, trebuie mai întâi să creați manual aceste documente apelând document() care ia un șir de identificare unic ca intrare. Apoi puteți popula documentele prin apelarea a stabilit() metoda, care, ca și adăuga , se așteaptă ca o hartă să fie singurul argument.

De exemplu, următorul cod creează și umple un nou document numit PLANETA PĂMÂNT:

solarSystem.document ("PLANET_EARTH") .set (mapOf ("nume" la "pământ", "număr" la 3, "gravitate" la 9.807))

Dacă mergeți la consola Firebase și aruncați o privire asupra conținutului bazei de date, veți putea să vedeți ușor codul personalizat.

Feriți-vă că în cazul în care ID-ul personalizat vă trece la document() există deja o metodă în baza de date a stabilit() metoda va suprascrie conținutul documentului asociat.

5. Crearea de sub-colecții

Suportul pentru subcollecții este una dintre cele mai puternice caracteristici ale Firestore și este ceea ce o deosebește considerabil de baza de date Firebase Realtime. Folosind subcollecții, nu puteți doar să adăugați cu ușurință structuri imbricate în datele dvs., ci și să vă asigurați că interogările dvs. vor consuma cantități minime de lățime de bandă.

Crearea unei subcolecții seamănă cu crearea unei colecții. Tot ce trebuie să faceți este să apelați Colectie() metoda pe DocumentReference obiect și să treacă un șir la el, care va fi folosit ca numele de subcollecție.

De exemplu, următorul cod creează o subcolecție numită sateliți și o asociază cu PLANETA PĂMÂNT document:

val satelițiiOfEarth = solarSystem.document ("PLANET_EARTH"). colecție ("sateliți")

Odată ce ați făcut referire la o subcolulare, sunteți liber să apelați adăuga() sau a stabilit() metodele de adăugare a documentelor.

satelițiOfEarth.add (mapOf ("nume" la "Lună", "gravitate" până la 1,62, "rază" până la 1738))

După ce executați codul de mai sus, PLANETA PĂMÂNT documentul va arăta astfel în consola Firebase:

6. Executarea interogărilor

Efectuarea unei operații de citire pe baza de date Firestore este foarte ușoară dacă cunoașteți ID-ul documentului pe care doriți să-l citiți. De ce? Deoarece puteți obține o referință directă la document apelând Colectie() și document() metode. De exemplu, iată cum puteți obține o referință la PLANETA PĂMÂNT document care aparține sistem solar Colectie:

val planetEarthDoc = myDB.collection ("solar_system") .document ("PLANET_EARTH")

Pentru a citi conținutul documentului, trebuie să apelați asincronul obține() , care returnează a Sarcină. Prin adăugarea unui OnSuccessListener la aceasta, puteți fi anunțat când operația de citire se termină cu succes.

Rezultatul unei operații de citire este a DocumentSnapshot obiect, care conține perechile cheie-valoare prezente în document. Prin utilizarea lui obține() , puteți obține valoarea oricărei chei valide. Următorul exemplu vă arată cum:

  () () () () () () Gravitatea Pământului este de 9.807 m / s / s

Dacă nu cunoașteți ID-ul documentului pe care doriți să îl citiți, va trebui să rulați o interogare tradițională într-o întreagă colecție. API-ul Firestore oferă metode de filtrare cu nume intuitiv, cum ar fi whereEqualTo ()whereLessThan (), și whereGreaterThan (). Deoarece metodele de filtrare pot returna mai multe documente ca rezultate, veți avea nevoie de o buclă în interiorul dvs. OnSuccessListener pentru a gestiona fiecare rezultat.

De exemplu, pentru a obține conținutul documentului pentru planeta Venus, pe care am adăugat-o într-o etapă anterioară, ați putea folosi următorul cod:

("name", "Venus") .get (), addOnSuccessListener it.forEach println ("Gravitatea lui $ it.get (" nume ") .get (gravitatea) m / s / s " // OUTPUT: // Gravitatea lui Venus este 8,87 m / s / s

În cele din urmă, dacă sunteți interesat să citiți toate documentele care aparțin unei colecții, puteți apela direct obține() privind colectarea. De exemplu, iată cum puteți lista toate planetele prezente în sistem solar Colectie:

()) // OUTPUT: // Earth // Venus // Mercury () () () ()

Rețineți că, în mod implicit, nu există o ordine clară în care rezultatele să fie returnate. Dacă doriți să le comandați pe baza unei chei care este prezentă în toate rezultatele, puteți să utilizați orderby () metodă. Următorul cod comandă rezultatele pe baza valorii număr cheie:

()) // OUTPUT: // Mercury / / Venus / / () () / Pământ

7. Ștergerea datelor

Pentru a șterge un document cu un ID cunoscut, tot ce trebuie să faceți este să faceți o trimitere la acesta și apoi să apelați șterge() metodă.

myDB.collection ("solar_system") .document ("PLANET_EARTH") .delete ()

Ștergerea mai multor documente-documente pe care le obțineți ca urmare a unei interogări - este puțin mai complicată deoarece nu există o metodă integrată pentru a face acest lucru. Există două abordări diferite pe care le puteți urmări.

Abordarea cea mai ușoară și cea mai intuitivă, deși este potrivită doar pentru un număr foarte mic de documente, este de a relua rezultatele, de a obține o referință la fiecare document și apoi să apelați șterge() metodă. Iată cum puteți utiliza abordarea pentru a șterge toate documentele din sistem solar Colectie:

myDB.collection ("solar_system") .get (). addOnSuccessListener it.forEach it.reference.delete ()

O abordare mai eficientă și mai scalabilă este utilizarea unei operații în șarje. Operațiile în lot nu pot șterge numai mai multe documente în mod atomic, ci și reduc semnificativ numărul de conexiuni de rețea necesare.

Pentru a crea un lot nou, trebuie să apelați lot() metoda bazei dvs. de date, care returnează o instanță a WriteBatch clasă. Apoi, puteți trece prin toate rezultatele interogării și le puteți marca pentru ștergere prin transmiterea lor către șterge() metodă a WriteBatch obiect. În cele din urmă, pentru a începe efectiv procesul de ștergere, puteți apela comite () metodă. Următorul cod vă arată cum:

()) addOnSuccessListener // Creare batch val myBatch = myDB.batch () // Adăugarea documentelor în batch it.forEach myBatch.delete (it.reference) // Run batch myBatch.commit ()

Rețineți că încercarea de a adăuga prea multe documente într-o singură operație batch poate duce la erori în afara memoriei. Prin urmare, în cazul în care interogarea dvs. este probabil să returneze un număr mare de documente, trebuie să vă asigurați că le-ați împărțit în mai multe loturi

Concluzie

În acest tutorial introductiv, ați învățat cum să efectuați operații de citire și scriere în Google Cloud Firestore. Vă sugerez să începeți să o utilizați imediat în proiectele Android. Există o șansă bună ca în viitor să înlocuiască baza de date Realtime. De fapt, Google deja spune că până când va ieși din beta, va fi mult mai fiabil și mai scalabil decât baza de date Realtime.

Pentru a afla mai multe despre Cloud Firestore, vă puteți referi la documentația oficială.

Și în timp ce sunteți aici, verificați câteva dintre celelalte tutoriale ale noastre despre dezvoltarea aplicațiilor Firebase și Android!

Cod