(İ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:
- Emülatöre bağlanmak için uygulamanızın test yapılandırmasına bir kod satırı ekleme.
- Yerel proje dizininizin kök dizininden
firebase emulators:start
komutunu çalıştırın. - 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.