Android Academy · Oppitunti

Cloud Firestoren perusteet

Lukekaa ja kirjoittakaa reaaliaikaisia tietoja.

Oppitunti 3/413 vaihetta

Cloud Firestoren perusteet on ilmainen Android Academy-oppitunti CoddyKitissä. Tämä on oppitunti 3/4. Voit lukea tästä oppimispolusta kokonaan mitkä tahansa 3 oppituntia ilmaiseksi — sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä käytännön harjoittelun sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Oppitunti kuuluu Android Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Android Academy-kurssilla on yhteensä 4 oppituntia.

Mikä on Cloud Firestore?

Cloud Firestore on Firebasen joustava ja skaalautuva NoSQL-tietokanta. Se tallentaa tiedot dokumentteina, jotka on ryhmitelty kokoelmiksi.

  • Dokumentti on joukko avain-arvo-kenttiä (JSON-olion tapaan).
  • Kokoelma on dokumenttien säilö.
  • Dokumentit voivat sisältää alikokoelmia, jolloin muodostuu puu.

Firestore tarjoaa myös reaaliaikaiset päivitykset ja toimii offline-tilassa ilman lisämäärityksiä.

Firestore-instanssin hakeminen

Käytä tietokantaa Firebase.firestore-olion kautta. Sen jälkeen voit siirtyä kokoelmaan collection("name")-kutsulla ja tiettyyn dokumenttiin document("id")-kutsulla.

Viitteiden luominen on kevyttä — ne kuvaavat sijaintia, eivät itse tietoja.

import com.google.firebase.Firebase
import com.google.firebase.firestore.firestore

val db = Firebase.firestore

val usersRef = db.collection("users")
val oneUser = db.collection("users").document("abc123")

Tietojen mallintaminen

Firestore sopii hyvin yhteen Kotlinin data class -luokkien kanssa. Jokaisesta ominaisuudesta tulee dokumentin kenttä.

Määritä luokalle argumentiton konstruktori (oletusarvot hoitavat tämän), jotta Firestore voi muuntaa dokumentit takaisin olioiksi.

data class Note(
    val title: String = "",
    val body: String = "",
    val done: Boolean = false,
    val createdAt: Long = 0L
)

Dokumentin kirjoittaminen

Luo dokumentti tai korvaa olemassa oleva dokumentti set-metodilla. Anna Firestoren luoda tunnus add-metodilla tai valitse oma tunnus kutsulla document(id).set(...).

Nämä kutsut palauttavat Task-oliot; korutiineissa voit kutsua niille await()-metodia.

import com.google.firebase.Firebase
import com.google.firebase.firestore.firestore
import kotlinx.coroutines.tasks.await

suspend fun addNote(note: Note): String {
    val ref = Firebase.firestore
        .collection("notes")
        .add(note)          // auto-generated ID
        .await()
    return ref.id
}

Dokumentin lukeminen

get() hakee dokumentin kerran. Muunna se omaksi tietoluokaksesi kutsulla toObject(Note::class.java).

Tarkista aina exists() — puuttuvaan dokumenttiin viittaava viite palauttaa tilannevedoksen, jota ei yksinkertaisesti ole olemassa.

import com.google.firebase.Firebase
import com.google.firebase.firestore.firestore
import kotlinx.coroutines.tasks.await

suspend fun loadNote(id: String): Note? {
    val snapshot = Firebase.firestore
        .collection("notes")
        .document(id)
        .get()
        .await()
    return if (snapshot.exists()) snapshot.toObject(Note::class.java) else null
}

Päivittäminen ja poistaminen

update muuttaa tiettyjä kenttiä koskematta dokumentin muihin kenttiin. delete poistaa koko dokumentin.

Käytä set(..., SetOptions.merge())-kutsua, jos haluat osittaisen kirjoituksen, joka myös luo dokumentin, jos sitä ei vielä ole.

import com.google.firebase.Firebase
import com.google.firebase.firestore.firestore
import kotlinx.coroutines.tasks.await

suspend fun markDone(id: String) {
    Firebase.firestore.collection("notes").document(id)
        .update("done", true)
        .await()
}

suspend fun removeNote(id: String) {
    Firebase.firestore.collection("notes").document(id)
        .delete()
        .await()
}

Kokoelman kyselyt

Muodosta kyselyitä ketjuttamalla suodattimia: whereEqualTo, whereGreaterThan, orderBy, limit ja muita.

Kysely palauttaa QuerySnapshot-olion. Käy sen dokumentit läpi ja muunna kukin dokumentti malliksesi.

import com.google.firebase.Firebase
import com.google.firebase.firestore.firestore
import kotlinx.coroutines.tasks.await

suspend fun pendingNotes(): List<Note> {
    val snap = Firebase.firestore.collection("notes")
        .whereEqualTo("done", false)
        .orderBy("createdAt")
        .limit(20)
        .get()
        .await()
    return snap.documents.mapNotNull { it.toObject(Note::class.java) }
}

Reaaliaikaiset kuuntelijat

Firestoren tehokkain ominaisuus on reaaliaikaisuus. addSnapshotListener toimittaa nykyiset tiedot heti ja välittää sitten jokaisen muutoksen automaattisesti.

Se palauttaa ListenerRegistration-olion — lopeta päivitysten vastaanottaminen kutsumalla remove()-metodia, kun et enää tarvitse kuuntelijaa.

import com.google.firebase.Firebase
import com.google.firebase.firestore.firestore

val registration = Firebase.firestore.collection("notes")
    .whereEqualTo("done", false)
    .addSnapshotListener { snapshot, error ->
        if (error != null || snapshot == null) return@addSnapshotListener
        val notes = snapshot.toObjects(Note::class.java)
        println("Now have ${notes.size} pending notes")
    }

// Later: registration.remove()

Reaaliaikaiset tiedot Flow-virtana

Composessa on idiोmaattista tarjota Firestoren tiedot Kotlinin Flow-virtana. callbackFlow yhdistää kuuntelijan takaisinkutsun flow-virtaan, ja awaitClose poistaa kuuntelijan, kun keräys lopetetaan.

import com.google.firebase.Firebase
import com.google.firebase.firestore.firestore
import kotlinx.coroutines.channels.awaitClose
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.callbackFlow

fun notesFlow(): Flow<List<Note>> = callbackFlow {
    val reg = Firebase.firestore.collection("notes")
        .addSnapshotListener { snap, err ->
            if (err == null && snap != null) {
                trySend(snap.toObjects(Note::class.java))
            }
        }
    awaitClose { reg.remove() }
}

Tietojen näyttäminen Composessa

Kerää flow-virta collectAsStateWithLifecycle()-kutsulla ja näytä tiedot LazyColumn-komponentissa. Lista päivittyy automaattisesti aina, kun Firestore muuttuu — erillistä manuaalista päivitystä ei tarvita.

@Composable
fun NotesScreen(viewModel: NotesViewModel) {
    val notes by viewModel.notes.collectAsStateWithLifecycle()

    LazyColumn {
        items(notes) { note ->
            ListItem(
                headlineContent = { Text(note.title) },
                supportingContent = { Text(note.body) }
            )
        }
    }
}

Tietoturvasäännöt ovat tärkeitä

Firestore on oletuksena lukittu. Tietoturvasäännöt määrittävät, kuka voi lukea tai kirjoittaa kuhunkin polkuun — ne suoritetaan palvelimella, eikä asiakas voi ohittaa niitä.

Yleinen sääntö on, että käyttäjä saa käyttää vain omia tietojaan, jotka on yksilöity todennuksen uid-arvolla.

// firestore.rules
rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /users/{userId}/{document=**} {
      allow read, write: if request.auth != null
                         && request.auth.uid == userId;
    }
  }
}

Pikatarkistus

Haluat Compose-listan päivittyvän heti aina, kun taustalla olevat Firestore-tiedot muuttuvat, ilman manuaalista päivitystä. Mitä API:a käytät?

Kertaus: Firestore

Osaat nyt tallentaa ja synkronoida tietoja Cloud Firestorella:

  • Tiedot tallennetaan dokumentteina kokoelmiin; mallinna ne Kotlinin data class -luokilla.
  • Kirjoita tiedot add- ja set-metodeilla, lue get-metodilla ja muuta tai poista niitä update- ja delete-metodeilla.
  • Tee kyselyitä whereEqualTo-, orderBy- ja limit-metodeilla.
  • Käytä addSnapshotListener-metodia (tai callbackFlow-ratkaisua) reaaliaikaista käyttöliittymää varten.
  • Suojaa tiedot tietoturvasäännöillä, jotka perustuvat arvoon request.auth.uid.

Seuraavaksi: käyttäjien tavoittaminen, kun sovellus on suljettu, palvelulla Cloud Messaging.

Aloita maksutta

Opi Kotlin tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
36
Oppitunnit
152

Usein kysytyt kysymykset

Onko oppitunti ”Cloud Firestoren perusteet” ilmainen?

Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa Android Academy-oppimispolun 3 oppituntia, myös oppitunnin “Cloud Firestoren perusteet”. Sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä interaktiiviset harjoitukset sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Android Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Cloud Firestoren perusteet”?

Lukekaa ja kirjoittakaa reaaliaikaisia tietoja. Harjoittelet Android Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni Android Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin Android Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 3/4.

Kuinka kauan ”Cloud Firestoren perusteet”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä Android Academy-oppitunnilla?

Kyllä. Jokainen Android Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. Firebasen käyttöönotto
  2. Firebase Authentication
  3. Cloud Firestoren perusteet
  4. Push-viestit Cloud Messagingilla
← Takaisin: Android Academy