Cloud Firestore er et nylig tillegg til Firebase-familien av produkter. Selv om det fortsatt er i beta, presenteres det allerede av Google som et mer fleksibelt og funksjonsrikt alternativ til Firebase Realtime Database.
Hvis du noen gang har brukt Realtime Database, er du sannsynligvis klar over at det egentlig er et stort JSON-dokument som er best egnet til å lagre bare enkle nøkkelverdier. Lagring av hierarkiske data på den effektivt og sikkert, selv om det er mulig, er ganske tungvint og krever en gjennomtenkt strategi, som vanligvis innebærer flattning av dataene så mye som mulig eller denormalisering av det. Uten en slik strategi, vil spørringer på Realtime Database sannsynligvis forbruke unødvendig store mengder båndbredde.
Cloud Firestore, som er mer beslektet med dokumentorienterte databaser som MongoDB og CouchDB, har ingen slike problemer. Videre kommer det med et stort antall veldig praktiske funksjoner, for eksempel støtte for batchoperasjoner, atomskriver og indekserte spørringer.
I denne veiledningen hjelper jeg deg med å komme i gang med å bruke Cloud Firestore på Android-plattformen.
For å kunne følge denne opplæringen må du:
Før du bruker Firebase-produkter i Android-appen din, må du opprette et nytt prosjekt for det i Firebase-konsollen. For å gjøre det, logg inn på konsollen og trykk på Legg til prosjekt knappen på velkomstskjermbildet.
I dialogboksen som dukker opp, gi et meningsfylt navn til prosjektet, eventuelt gi et meningsfylt ID til det, og trykk på Opprett prosjekt knapp.
Når prosjektet er opprettet, kan du sette Firestore som sin database ved å navigere til Utvikle> Database og trykke på Prøv Firestore Beta knapp.
På neste skjermbilde må du kontrollere at du velger Start i testmodus alternativet og trykk på Aktiver knapp.
På dette tidspunktet har du en tom Firestore-database som er klar til bruk i appen din.
Ditt Android Studio-prosjekt vet fortsatt ingenting om Firebase-prosjektet du opprettet i forrige trinn. Den enkleste måten å opprette en forbindelse mellom de to er å bruke Android Studio's Firebase Assistant.
Gå til Verktøy> Brannbase Å åpne assistenten.
Fordi Firestore fortsatt er i beta, støtter assistenten det ennå ikke. Likevel, ved å legge til Firebase Analytics i appen din, kan du automatisere de fleste nødvendige konfigurasjonstrinn.
Start med å klikke på Logg på en Analytics-hendelse lenke under Analytics delen og trykke på Koble til Firebase knapp. Et nytt nettleservindu skal nå dukke opp og spørre om du vil tillate Android Studio å blant annet administrere Firebase-data.
trykk Tillate knappen for å fortsette.
Tilbake i Android Studio, i dialogboksen som dukker opp, velg Velg et eksisterende Firebase- eller Google-prosjekt alternativ, velg Firebase-prosjektet du opprettet tidligere, og trykk på Koble til Firebase knapp.
Deretter trykker du på Legg til Analytics i appen din knappen for å legge til kjernen Firebase-avhengigheter til prosjektet ditt.
Til slutt, for å legge Firestore som en gjennomføring
avhengighet, legg til følgende linje i app
modulens build.gradle fil:
implementering 'com.google.firebase: firebase-firestore: 11.8.0'
Ikke glem å trykke på Synkroniser nå knappen for å fullføre konfigurasjonen. Hvis du støter på noen versjonskonfliktfeil under synkroniseringsprosessen, må du kontrollere at versjonene av Firestore-avhengigheten og Firebase Core-avhengigheten er identiske og prøv igjen.
Firestore er en NoSQL-database som lar deg lagre data i form av JSON-lignende dokumenter. Et dokument som er lagret på det, kan imidlertid ikke eksistere uavhengig av hverandre. Den må alltid tilhøre en samling. Som navnet antyder, er en samling bare en masse dokumenter.
Dokumenter i en samling er åpenbart søsken. Hvis du vil etablere foreldre-barns forhold mellom dem, må du imidlertid bruke undersamlinger. En underkolleksjon er bare en samling som tilhører et dokument. Som standard blir et dokument automatisk overordnet for alle dokumentene som tilhører sine undersamlinger.
Det er også verdt å merke seg at Firestore klarer å opprette og slette både samlinger og delkolleksjoner av seg selv. Når du prøver å legge til et dokument i en ikke-eksisterende samling, oppretter den samlingen. På samme måte, når du sletter alle dokumentene fra en samling, slettes den.
For å kunne skrive til Firestore-databasen fra Android-appen din, må du først få en referanse til den ved å ringe getInstance ()
metode av FirebaseFirestore
klasse.
val myDB = FirebaseFirestore.getInstance ()
Deretter må du enten opprette en ny samling eller få en referanse til en eksisterende samling ved å ringe samling()
metode. For eksempel, på en tom database, oppretter følgende kode en ny samling som heter solsystemet
:
val solarSystem = myDB.collection ("solar_system")
Når du har en referanse til en samling, kan du begynne å legge til dokumenter ved å ringe den Legg til()
metode, som forventer et kart som argument.
// Legg til et dokument solarSystem.add (mapOf ("Name" til "Mercury", "number" til 1, "gravity" til 3.7)) // Legg til et annet dokument solarSystem.add (mapOf ("navn" til "Venus" , "tall" til 2, "tyngdekraften" til 8,87))
De Legg til()
Metoden genererer automatisk og tilordner en unik alfanumerisk identifikator til hvert dokument det oppretter. Hvis du vil at dokumentene dine skal ha dine egne egendefinerte IDer i stedet, må du først opprette disse dokumentene manuelt ved å ringe dokument()
metode, som tar en unik ID-streng som sin inngang. Du kan deretter fylle dokumentene ved å ringe sett()
metode, som, som Legg til
metode, forventer et kart som eneste argument.
For eksempel oppretter og fyller følgende kode et nytt dokument som heter PLANETEN JORDEN
:
solarSystem.document ("PLANET_EARTH") .sett (mapOf ("navn" til "Earth", "number" til 3, "gravity" til 9,807))
Hvis du går til Firebase-konsollen og tar en titt på innholdet i databasen, kan du enkelt se den egendefinerte IDen.
Vær oppmerksom på at hvis den egendefinerte IDen du overfører til dokument()
Metoden finnes allerede i databasen, den sett()
Metoden vil overskrive innholdet i det tilknyttede dokumentet.
Støtte for subcollections er en av de mest kraftige funksjonene i Firestore, og det som gjør det markant forskjellig fra Firebase Realtime Database. Ved hjelp av subcollections kan du ikke bare enkelt legge til nestede strukturer til dataene dine, men også være sikker på at dine spørsmål vil forbruke minimal mengde båndbredde.
Å lage en undersamling er som om å lage en samling. Alt du trenger å gjøre er å ringe samling()
metode på en DocumentReference
objekt og send en streng til den, som vil bli brukt som navnet på undersamlingen.
For eksempel oppretter følgende kode en underkolleksjon som heter satellitter
og forbinder det med PLANETEN JORDEN
dokument:
val satellitterOfEarth = solarSystem.document ("PLANET_EARTH") .collection ("satellitter")
Når du har en referanse til en underkolleksjon, kan du ringe Legg til()
eller sett()
metoder for å legge til dokumenter i den.
satellitterOfEarth.add (mapOf ("navn" til "The Moon", "gravity" til 1.62, "radius" til 1738))
Etter at du har kjørt ovennevnte kode, vil PLANETEN JORDEN
Dokumentet vil se slik ut i Firebase-konsollen:
Å utføre en leseoperasjon på Firestore-databasen er veldig enkelt hvis du kjenner IDen til dokumentet du vil lese. Hvorfor? Fordi du direkte kan få en referanse til dokumentet ved å ringe samling()
og dokument()
metoder. For eksempel, her er hvordan du kan få en referanse til PLANETEN JORDEN
dokument som tilhører solsystemet
samling:
val planetEarthDoc = myDB.collection ("solar_system") .document ("PLANET_EARTH")
For å lese innholdet i dokumentet, må du ringe den asynkrone få()
metode, som returnerer a Oppgave
. Ved å legge til en OnSuccessListener
til det, kan du bli varslet når leseoperasjonen fullføres vellykket.
Resultatet av en leseoperasjon er a DocumentSnapshot
objekt, som inneholder nøkkelverdierparene som er tilstede i dokumentet. Ved å bruke sin få()
metode, kan du få verdien av en gyldig nøkkel. Følgende eksempel viser deg hvordan:
planetEarthDoc.get (). addOnSuccessListener println ("Gravity of $ it.get (" name ") er $ it.get (" gravity ") m / s / s") // UTGANG: // Jordens tyngde er 9,807 m / s / s
Hvis du ikke kjenner IDen til dokumentet du vil lese, må du kjøre et tradisjonelt søk på en hel samling. Firestore API gir intuitivt navngitte filter metoder som whereEqualTo ()
, whereLessThan ()
, og whereGreaterThan ()
. Fordi filtermetodene kan returnere flere dokumenter som deres resultater, trenger du en loop i din OnSuccessListener
å håndtere hvert resultat.
For eksempel, for å få innholdet i dokumentet for planet Venus, som vi la til i et tidligere trinn, kan du bruke følgende kode:
myDB.collection ("solar_system") .whereEqualTo ("navn", "Venus") .get (). addOnSuccessListener it.forEach println («Gravity of $ it.get (" name ") er $ it .get ("tyngdekraften") m / s / s ") // UTGANG: // Venusens tyngde er 8,87 m / s / s
Til slutt, hvis du er interessert i å lese alle dokumentene som tilhører en samling, kan du ringe direkte få()
metode på samlingen. For eksempel, her er hvordan du kan liste alle planeter som er tilstede i solsystemet
samling:
myDB.collection ("solar_system") .get (). addOnSuccessListener it.forEach println (it.get ("name")) // UTGANG: // Earth // Venus // Mercury
Merk at det som standard ikke er noen bestemt ordre der resultatene returneres. Hvis du vil bestille dem basert på en nøkkel som er til stede i alle resultatene, kan du gjøre bruk av rekkefølge etter()
metode. Følgende kode ordner resultatene basert på verdien av Nummer
nøkkel:
myDB.collection ("solar_system") .orderBy ("number") .get (). addOnSuccessListener it.forEach println (it.get ("name")) // UTGANG: // Mercury // Venus / / Earth
For å slette et dokument med en kjent ID, er alt du trenger å gjøre å få en referanse til det og deretter ringe til delete ()
metode.
myDB.collection ("solar_system") .document ("PLANET_EARTH") .delete ()
Hvis du sletter flere dokumentdokumenter du får som følge av en spørring, er det litt mer komplisert fordi det ikke er noen innebygd metode for å gjøre det. Det er to forskjellige tilnærminger du kan følge.
Den enkleste og mest intuitive tilnærmingen, selv om den bare passer for et svært lite antall dokumenter, er å gå gjennom resultatene, få en referanse til hvert dokument, og ring deretter delete ()
metode. Slik kan du bruke tilnærmingen til å slette alle dokumentene i solsystemet
samling:
myDB.collection ("solar_system") .get (). addOnSuccessListener it.forEach it.reference.delete ()
En mer effektiv og skalerbar tilnærming er å bruke en batchoperasjon. Batchoperasjoner kan ikke bare slette flere dokumenter atomvist, men også redusere antallet nettverksforbindelser som kreves.
For å opprette en ny batch, må du ringe parti()
Metode i databasen din, som returnerer en forekomst av WriteBatch
klasse. Deretter kan du løse gjennom alle resultatene av spørringen og merke dem til sletting ved å sende dem til delete ()
metode av WriteBatch
gjenstand. Endelig, for å faktisk starte slettingsprosessen, kan du ringe begå()
metode. Følgende kode viser deg hvordan:
myDB.collection ("solar_system") .get (). addOnSuccessListener // Opprett batch val myBatch = myDB.batch () // Legg til dokumenter for å batch it.forEach myBatch.delete (it.reference) // Kjør batch myBatch.commit ()
Merk at forsøk på å legge for mange dokumenter til en enkelt batchoperasjon, kan føre til feil i minnet. Derfor, hvis spørringen din sannsynligvis vil returnere et stort antall dokumenter, må du sørge for at du deler dem i flere batcher
I denne innledende veiledningen lærte du hvordan du utfører lese- og skriveoperasjoner på Google Cloud Firestore. Jeg foreslår at du begynner å bruke den i Android-prosjektene dine med en gang. Det er en god sjanse for at den vil erstatte Realtime Database i fremtiden. Faktisk sier Google allerede at når det kommer ut av beta, blir det mye mer pålitelig og skalerbar enn Realtime Database.
Hvis du vil vite mer om Cloud Firestore, kan du se den offisielle dokumentasjonen.
Og mens du er her, sjekk ut noen av våre andre opplæringsprogrammer på Firebase og Android app utvikling!