Verileri Okuma ve Yazma

(İsteğe bağlı) Firebase Emulator Suite ile prototip oluşturun ve test yapın

Uygulamanızın Realtime Database'den nasıl okuduğu ve yazdığından bahsetmeden önce Gerçek Zamanlı Veritabanı'nın prototipini oluşturmak ve test etmek için kullanabileceğiniz bir araç setinden bahsedelim. şu işleve sahip: Firebase Emulator Suite. Farklı verileri deniyorsanız güvenlik kurallarınızı optimize ederek veya makine öğreniminden en iyi şekilde arka uçla etkileşim kurmanın ve yerel olarak çalışabilmenin uygun maliyetli bir yoludur. çok iyi bir fikir olabilir.

Realtime Database emülatörü, Emulator Suite'in bir parçası. uygulamanızın emüle edilmiş veritabanı içeriğinizle ve yapılandırmanızla etkileşim kurmasına olanak tanır. ve isteğe bağlı olarak emüle edilen proje kaynaklarınızın (işlevler, diğer veritabanları ve güvenlik kuralları).emulator_suite_short

Realtime Database emülatörünün kullanımı yalnızca birkaç adımdan oluşur:

  1. Emülatöre bağlanmak için uygulamanızın test yapılandırmasına bir kod satırı ekleme.
  2. Yerel proje dizininizin kök dizininden firebase emulators:start komutunu çalıştırın.
  3. Realtime Database platformu kullanarak uygulamanızın prototip kodundan çağrı yapma SDK'yı her zamanki gibi kullanın veya Realtime Database REST API'yi kullanın.

Realtime Database ve Cloud Functions'ı içeren adım adım açıklamalı ayrıntılı bir kılavuz mevcuttur. Ayrıca Emulator Suite tanıtımına göz atmanız önerilir.

Veritabanı Referansı Alma

Veritabanından veri okumak veya yazmak için DatabaseReference:

DatabaseReference ref = FirebaseDatabase.instance.ref();

Verileri yazma

Bu belgede Firebase verilerini okuma ve yazmayla ilgili temel bilgiler verilmektedir.

Firebase verileri bir DatabaseReference üzerine yazılır ve bu veriler bekleyen veya dinlemede bir sorun yoktur. Etkinlikler yayınlanır bir kez, verilerin ilk durumu için bir kez ve veriler her değiştiğinde bir kez daha düzenleyin.

Temel yazma işlemleri

Temel yazma işlemleri için verileri belirli bir yere kaydetmek üzere set() kullanabilirsiniz yeni bir referans noktası oluşturarak bu yoldaki mevcut tüm verileri değiştirebilirsiniz. Referans ayarlayabilirsiniz şu türlere: String, boolean, int, double, Map, List.

Örneğin, aşağıdaki gibi set() içeren bir kullanıcı ekleyebilirsiniz:

DatabaseReference ref = FirebaseDatabase.instance.ref("users/123");

await ref.set({
  "name": "John",
  "age": 18,
  "address": {
    "line1": "100 Mountain View"
  }
});

set() bu şekilde kullanılırsa belirtilen konumdaki verilerin üzerine yazılır. dahildir. Ancak, eğer yoksa çocuklarınız için yeniden yazmanız gerekir. Kullanıcıların profillerini güncellemelerine izin vermek istiyorsanız kullanıcı adını şu şekilde güncelleyebilirsiniz:

DatabaseReference ref = FirebaseDatabase.instance.ref("users/123");

// Only update the name, leave the age and address!
await ref.update({
  "age": 19,
});

update() yöntemi, düğümlere giden bir alt yol kabul eder ve birden çok öğeyi güncellemenize olanak tanır. düğümlere aynı anda uygulanır:

DatabaseReference ref = FirebaseDatabase.instance.ref("users");

await ref.update({
  "123/age": 19,
  "123/address/line1": "1 Mountain View",
});

Verileri okuma

Değer etkinliklerini dinleyerek verileri okuma

Bir yoldaki verileri okumak ve değişiklikleri dinlemek için Dinlenecek onValue DatabaseReference özelliği DatabaseEvent sn.

Belirli bir yoldaki verileri okumak için DatabaseEvent öğesini kullanabilirsiniz. mevcut hâlini belirler. Bu etkinlik, ekli olduğunu ve her veriyle ilgili her seferinde anlamına gelir. Etkinlikte, söz konusu etkinlikteki tüm verileri içeren bir snapshot özelliği var çocuk verileri dahil. Veri yoksa anlık görüntü exists özelliği false olacak ve value özelliği null olacaktır.

Aşağıdaki örnekte, ayrıntıları:

DatabaseReference starCountRef =
        FirebaseDatabase.instance.ref('posts/$postId/starCount');
starCountRef.onValue.listen((DatabaseEvent event) {
    final data = event.snapshot.value;
    updateStarCount(data);
});

İşleyici, belirtilenDataSnapshot etkinlik sırasında veritabanında bulunan, value mülkündeki konumu.

Verileri bir kez oku

get() kullanarak bir kez okuma

SDK, veritabanı sunucularıyla etkileşimleri yönetecek şekilde tasarlanmıştır. Uygulama çevrimiçi veya çevrimdışı.

Genel olarak, şu bilgileri okumak için yukarıda açıklanan değer etkinlikleri tekniklerini veya arka uçtan veri güncellemelerinin bildirim almasını sağlar. Bu teknikler kullanımınızı ve faturalandırmanızı azaltır, kullanıcılarınıza en iyi deneyimi sunmak için optimize edilmiştir. hem de çevrimdışı deneyim.

Verilere yalnızca bir kez ihtiyaç duyarsanız, raporun anlık görüntüsünü almak için get() kullanabilirsiniz bu verileri kaldırmanızı sağlar. get() herhangi bir nedenle istemci, yerel depolama önbelleğini kontrol eder ve bir hata döndürür. bulabilirsiniz.

Aşağıdaki örnekte, bir kullanıcının herkese açık kullanıcı adının alınması gösterilmektedir tek seferde yalnızca bir kez verilmelidir:

final ref = FirebaseDatabase.instance.ref();
final snapshot = await ref.child('users/$userId').get();
if (snapshot.exists) {
    print(snapshot.value);
} else {
    print('No data available.');
}

Gereksiz get() kullanımı, bant genişliği kullanımını artırabilir ve kayba neden olabilir Bu performans, gösterildiği gibi gerçek zamanlı bir dinleyici kullanılarak engellenebilir. bölümünü ziyaret edin.

Bir kez() ile verileri bir kez okuma

Bazı durumlarda, yerel önbellek değerinin döndürülmesini isteyebilirsiniz güncel bir değer olup olmadığını kontrol etmek yerine anında rapor oluşturur. O verileri yerel disk önbelleğinden almak için once() kullanabilirsiniz hemen teslim edebilirsiniz.

Bu, yalnızca bir kez yüklenmesi gereken ve yüklenmesi beklenmeyen veriler için yararlıdır. veya aktif dinlemeyi gerektirir. Örneğin blog uygulaması Yukarıdaki örneklerde, kullanıcı bir web sitesine girdiğinde kullanıcının profilini yüklemek için yeni bir yayın yazmaya başlayın:

final event = await ref.once(DatabaseEventType.value);
final username = event.snapshot.value?.username ?? 'Anonymous';

Verileri güncelleme veya silme

Belirli alanları güncelle

Diğer düğümlerin üzerine yazmadan bir düğümün belirli alt öğelerine aynı anda yazmak için alt düğümler için update() yöntemini kullanın.

update() çağrısı yapılırken alt düzey alt değerleri şu şekilde güncelleyebilirsiniz: anahtar için bir yol belirterek. Veriler ölçeklendirilmek üzere birden fazla konumda depolanıyorsa isterseniz, bu verilerin tüm örneklerini verilerin yayılması. Örneğin, sosyal blog uygulaması bir yayın oluşturup eşzamanlı olarak bunu son etkinlik feed'i ve yayınlayan kullanıcının etkinlik feed'i. Bunu yapmak için blog oluşturma uygulaması şuna benzer bir kod kullanır:

void writeNewPost(String uid, String username, String picture, String title,
        String body) async {
    // A post entry.
    final postData = {
        'author': username,
        'uid': uid,
        'body': body,
        'title': title,
        'starCount': 0,
        'authorPic': picture,
    };

    // Get a key for a new Post.
    final newPostKey =
        FirebaseDatabase.instance.ref().child('posts').push().key;

    // Write the new post's data simultaneously in the posts list and the
    // user's post list.
    final Map<String, Map> updates = {};
    updates['/posts/$newPostKey'] = postData;
    updates['/user-posts/$uid/$newPostKey'] = postData;

    return FirebaseDatabase.instance.ref().update(updates);
}

Bu örnekte, push() ile ilgili yayınları içeren düğümde bir yayın oluşturmak için /posts/$postid alanındaki tüm kullanıcıları ve anahtarı key. Bu anahtar, kullanıcının iş sayfasında ikinci bir giriş oluşturmak için kullanılabilir. /user-posts/$userid/$postid itibarıyla yayınları var.

Bu yolları kullanarak, bir bölgedeki birden fazla konumda aynı anda güncelleme yapabilirsiniz. tek bir update() çağrısıyla JSON ağacını oluşturabilirsiniz (örneğin, bu örnekte yeni yayını her iki konumda da oluşturur. Bu şekilde yapılan eş zamanlı güncellemeler çok önemli: ya tüm güncellemeler başarılı olur ya da tüm güncellemeler başarısız olur.

Tamamlama geri çağırması ekle

Verilerinizin ne zaman kaydedildiğini öğrenmek istiyorsanız birçok yolu vardır. Hem set() hem de update(), Future değerini döndürür. yazma işlemi başarıyla tamamlandığında çağrılan başarılı ve hata geri ve çağrının başarısız olduğu zamanı görebilirsiniz.

FirebaseDatabase.instance
    .ref('users/$userId/email')
    .set(emailAddress)
    .then((_) {
        // Data saved successfully!
    })
    .catchError((error) {
        // The write failed...
    });

Verileri silin

Verileri silmenin en basit yolu,remove() söz konusu verilerin konumu.

Ayrıca, başka bir yazma işleminin değeri olarak null belirterek silme işlemi de yapabilirsiniz. set() veya update() gibi. Bu tekniği, update() ile birlikte kullanarak Tek bir API çağrısında birden çok alt öğeyi silme.

Verileri işlem olarak kaydet

Eşzamanlı değişikliklerle bozulabilecek verilerle çalışırken, bir işlemi, yeni bir değer ileterek bir işlem işleyiciyi runTransaction() adresine gönderin. İşlem işleyici, bağımsız değişken olarak verilerin mevcut durumunu yazmak istediğiniz yeni durumu döndürür. Başka bir müşteri yeni değeriniz başarıyla yazılmadan önce konuma yazarsa güncelleme işlevi yeni geçerli değerle tekrar çağrılır ve yazma yeniden denendi.

Mesela örnek sosyal blog uygulaması örneğinde, kullanıcılara ve yayınların yıldızlarını kaldırabilir ve yayının kaç yıldız aldığını aşağıdaki şekilde takip edebilirsiniz:

void toggleStar(String uid) async {
  DatabaseReference postRef =
      FirebaseDatabase.instance.ref("posts/foo-bar-123");

  TransactionResult result = await postRef.runTransaction((Object? post) {
    // Ensure a post at the ref exists.
    if (post == null) {
      return Transaction.abort();
    }

    Map<String, dynamic> _post = Map<String, dynamic>.from(post as Map);
    if (_post["stars"] is Map && _post["stars"][uid] != null) {
      _post["starCount"] = (_post["starCount"] ?? 1) - 1;
      _post["stars"][uid] = null;
    } else {
      _post["starCount"] = (_post["starCount"] ?? 0) + 1;
      if (!_post.containsKey("stars")) {
        _post["stars"] = {};
      }
      _post["stars"][uid] = true;
    }

    // Return the new data.
    return Transaction.success(_post);
  });
}

Varsayılan olarak, işlem güncelleme işlevi her çalıştığında etkinlikler oluşturulur. Bu nedenle, fonksiyonu birden çok kez çalıştırırsanız ara durumlar görebilirsiniz. Bu ara durumları atlamak için applyLocally değerini false olarak ayarlayabilirsiniz. Bunun yerine, etkinlikler oluşturulmadan önce işlemin tamamlanmasını bekleyin:

await ref.runTransaction((Object? post) {
  // ...
}, applyLocally: false);

Bir işlemin sonucu, bilgilerini içeren TransactionResult Örneğin, işlemin gerçekleştirilip gerçekleştirilmediği ve yeni anlık görüntü:

DatabaseReference ref = FirebaseDatabase.instance.ref("posts/123");

TransactionResult result = await ref.runTransaction((Object? post) {
  // ...
});

print('Committed? ${result.committed}'); // true / false
print('Snapshot? ${result.snapshot}'); // DataSnapshot

İşlemi iptal etme

Bir işlemi güvenli bir şekilde iptal etmek isterseniz şu numarayı arayın: Transaction.abort() AbortTransactionException at:

TransactionResult result = await ref.runTransaction((Object? user) {
  if (user !== null) {
    return Transaction.abort();
  }

  // ...
});

print(result.committed); // false

Atomik sunucu tarafı artışları

Yukarıdaki kullanım örneğinde veritabanına iki değer yazıyoruz: Yayına yıldız veren/yıldızı kaldıran kullanıcı ve artan yıldız sayısı. Bir kullanıcının yayına yıldız eklediğini bilirsek atomik bir artış kullanabiliriz işlemidir.

void addStar(uid, key) async {
  Map<String, Object?> updates = {};
  updates["posts/$key/stars/$uid"] = true;
  updates["posts/$key/starCount"] = ServerValue.increment(1);
  updates["user-posts/$key/stars/$uid"] = true;
  updates["user-posts/$key/starCount"] = ServerValue.increment(1);
  return FirebaseDatabase.instance.ref().update(updates);
}

Bu kod bir işlem işlemi kullanmadığından otomatik olarak çakışan bir güncelleme varsa yeniden çalıştırın. Ancak, artış işlemi veritabanı sunucusunda gerçekleştiğinden çakışma olasılığı yoktur.

Uygulamaya özel çakışmaları (ör. kullanıcı adı) tespit edip reddetmek istiyorsanız daha önce yıldız eklediğiniz bir yayına yıldız ekleyerek kurallarından bahsedeceğiz.

Verilerle çevrimdışı çalışma

İstemcinin ağ bağlantısı kesilirse uygulamanız çalışmaya devam eder sağlayabilir.

Firebase veritabanına bağlı her istemcinin kendi dahili sürümü bulunur olabilir. Veriler yazıldığında, bu yerel sürüme yazılır. tıklayın. Firebase istemcisi bu verileri uzak veritabanı ile senkronize eder sağlamak için "en iyisini" yaparak .

Sonuç olarak, veritabanına yapılan tüm yazmalar yerel etkinlikleri hemen, sunucuya herhangi bir veri yazıldığından emin olabilirsiniz. Bu, uygulamanızın tüm ağ gecikmeleri veya bağlantılarından bağımsız şekilde yanıt verebilir.

Bağlantı yeniden kurulduğunda uygulamanız uygun veri kümesini alır Böylece istemcinin, istemcinin bunu gerçekleştirmesine gerek kalmadan mevcut sunucu durumuyla herhangi bir özel kod yazabilirsiniz.

Çevrimdışı davranışlara biraz daha değineceğiz. Online ve çevrimdışı özellikler hakkında daha fazla bilgi edinin.

Sonraki adımlar