0Pricing
Android Academy · Ders

Cloud Firestore Temelleri

Gerçek zamanlı verileri okuyup yazın.

Cloud Firestore Temelleri, CoddyKit'te ücretsiz bir Android Academy dersidir. Bu, 4 dersinin 3. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Android Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Android Academy kursu toplamda 4 dersten oluşur.

Cloud Firestore Nedir?

Cloud Firestore, Firebase'in esnek ve ölçeklenebilir NoSQL veritabanıdır. Verileri koleksiyonlar içinde gruplandırılmış belgeler olarak saklar.

  • Belge, anahtar/değer alanlarından oluşan bir kümedir (JSON nesnesi gibi).
  • Koleksiyon, belgeler için bir kapsayıcıdır.
  • Belgeler alt koleksiyonlar içerebilir ve böylece bir ağaç yapısı oluşturabilir.

Firestore ayrıca gerçek zamanlı güncellemeler sunar ve kutudan çıktığı hâliyle çevrimdışı çalışır.

Firestore Örneğini Alma

Veritabanına Firebase.firestore üzerinden erişin. Buradan collection("name") ile bir koleksiyona, document("id") ile de belirli bir belgeye ulaşırsınız.

Başvuruların oluşturulması maliyetsizdir — verinin kendisini değil, bir konumu tanımlarlar.

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")

Verileri Modelleme

Firestore, Kotlin veri sınıflarıyla sorunsuz biçimde eşleşir. Her özellik, belgedeki bir alana dönüşür.

Firestore'un belgeleri yeniden nesnelere dönüştürebilmesi için sınıfa bağımsız değişkensiz bir oluşturucu ekleyin (varsayılan değerler bunu sağlar).

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

Belge Yazma

Bir belge oluşturmak veya üzerine yazmak için set kullanın. Firestore'un bir ID oluşturmasını add ile sağlayabilir veya document(id).set(...) ile kendi ID'nizi seçebilirsiniz.

Bu çağrılar Task döndürür; coroutine'lerle bunları await() ile bekleyebilirsiniz.

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
}

Belge Okuma

get(), bir belgeyi bir kez getirir. toObject(Note::class.java) ile belgeyi veri sınıfınıza dönüştürün.

Her zaman exists() kontrolü yapın — olmayan bir belgeye yapılan başvuru, yalnızca mevcut olmayan bir anlık görüntü döndürür.

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
}

Güncelleme ve Silme

update, belgenin geri kalanına dokunmadan belirli alanları değiştirir. delete, belgeyi tamamen kaldırır.

Belge yokken de oluşturulan kısmi bir yazma işlemi istiyorsanız set(..., SetOptions.merge()) kullanın.

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()
}

Koleksiyonda Sorgulama

Filtreleri zincirleyerek sorgular oluşturun: whereEqualTo, whereGreaterThan, orderBy, limit ve daha fazlası.

Bir sorgu QuerySnapshot döndürür; her belgeyi modelinize dönüştürmek için belgeler üzerinde yineleme yapın.

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) }
}

Gerçek Zamanlı Dinleyiciler

Firestore'un en güçlü özelliği gerçek zamanlı olmasıdır. addSnapshotListener, mevcut verileri hemen iletir ve ardından her değişikliği otomatik olarak gönderir.

Bu işlev bir ListenerRegistration döndürür — güncellemeleri almayı durdurmak için işiniz bittiğinde remove() çağrısını yapın.

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()

Gerçek Zamanlı Verileri Flow Olarak Kullanma

Compose'ta Firestore'u Kotlin Flow olarak sunmak yaygın bir yaklaşımdır. callbackFlow, dinleyici geri çağrısını bir flow'a bağlar; awaitClose ise veri toplama durduğunda dinleyiciyi kaldırır.

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() }
}

Compose'ta Veri Gösterme

Flow'u collectAsStateWithLifecycle() ile toplayın ve bir LazyColumn içinde işleyin. Firestore değiştiğinde liste kendini günceller — elle yenileme gerekmez.

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

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

Güvenlik Kuralları Önemlidir

Firestore varsayılan olarak kilitlidir. Güvenlik kuralları, her yolu kimin okuyabileceğine veya yazabileceğine karar verir — sunucuda çalışırlar ve istemci tarafından atlatılamazlar.

Yaygın bir kural şudur: Bir kullanıcı yalnızca kimlik doğrulamadaki uid değeriyle anahtarlanmış kendi verilerine erişebilir.

// 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;
    }
  }
}

Hızlı Kontrol

Temel Firestore verileri değiştiğinde elle yenileme yapmadan anında güncellenen bir Compose listesi istiyorsunuz. Hangi API'yi kullanırsınız?

Özet: Firestore

Artık Cloud Firestore ile veri saklayıp eşitleyebilirsiniz:

  • Veriler koleksiyonlar içindeki belgelerde bulunur; bunları Kotlin veri sınıflarıyla modelleyin.
  • add/set ile yazın, get ile okuyun, update/delete ile değiştirin.
  • whereEqualTo, orderBy ve limit ile sorgulayın.
  • Gerçek zamanlı kullanıcı arayüzü için addSnapshotListener (veya bir callbackFlow) kullanın.
  • Verileri request.auth.uid temelinde tanımlanan güvenlik kurallarıyla koruyun.

Sırada: uygulama kapalıyken Cloud Messaging ile kullanıcılara ulaşmak var.

Sıkça Sorulan Sorular

“Cloud Firestore Temelleri” dersi ücretsiz mi?

Evet — “Cloud Firestore Temelleri” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Android Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Android Academy kursu toplamda 4 dersten oluşur.

“Cloud Firestore Temelleri” dersinde ne öğreneceğim?

Gerçek zamanlı verileri okuyup yazın. Android Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

Android Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te Android Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 3. dersidir.

“Cloud Firestore Temelleri” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu Android Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her Android Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. Firebase'i Kurma
  2. Firebase Kimlik Doğrulaması
  3. Cloud Firestore Temelleri
  4. Cloud Messaging ile Bildirim Gönderme
← Android Academy Sayfasına Dön