FIRDatabaseReference alma
Veri tabanından veri okumak veya yazmak için FIRDatabaseReference
örneğine ihtiyacınız vardır:
Swift
var ref: DatabaseReference! ref = Database.database().reference()
Objective-C
@property (strong, nonatomic) FIRDatabaseReference *ref; self.ref = [[FIRDatabase database] reference];
Okuma ve yazma listeleri
Veri listesine ekleme
Çok kullanıcılı uygulamalarda bir listeye veri eklemek için childByAutoId
yöntemini kullanın. childByAutoId
yöntemi, belirtilen Firebase referansına her yeni çocuk eklendiğinde benzersiz bir anahtar oluşturur. Listedeki her yeni öğe için otomatik olarak oluşturulan bu anahtarları kullanarak, bazı istemciler yazma çakışmaları olmadan aynı anda aynı konuma alt öğeler ekleyebilir. childByAutoId
tarafından oluşturulan benzersiz anahtar, bir zaman damgasına dayanır. Bu nedenle liste öğeleri otomatik olarak kronolojik olarak sıralanır.
Alt öğenin otomatik olarak oluşturulan anahtarının değerini almak veya alt öğe için veri ayarlamak üzere childByAutoId
yöntemi tarafından döndürülen yeni verilere ait referansı kullanabilirsiniz.
childByAutoId
referansı için getKey
çağrısı yapıldığında otomatik olarak oluşturulan anahtar döndürülür.
Veri yapınızı düzleştirmeyi kolaylaştırmak için bu otomatik olarak oluşturulan anahtarları kullanabilirsiniz. Daha fazla bilgi için veri dağıtma örneğine bakın.
Alt etkinlikleri dinleme
Alt öğe etkinlikleri, bir işlemden kaynaklanan belirli işlemlere (ör. childByAutoId
yöntemi aracılığıyla eklenen yeni bir alt öğe veya updateChildValues
yöntemi aracılığıyla güncellenen bir alt öğe) yanıt olarak tetiklenir.
Etkinlik türü | Tipik kullanım |
---|---|
FIRDataEventTypeChildAdded |
Öğe listelerini alın veya öğe listesine yapılan eklemeleri dinleyin. Bu etkinlik, mevcut her alt öğe için bir kez ve ardından belirtilen yola her yeni alt öğe eklendiğinde tekrar tetiklenir. Dinleyiciye, yeni alt öğenin verilerini içeren bir anlık görüntü iletilir. |
FIRDataEventTypeChildChanged |
Listedeki öğelerde yapılan değişiklikleri dinleme Bu etkinlik, bir alt düğüm değiştirildiğinde tetiklenir. Çocuk düğümünün alt öğelerinde yapılan tüm değişiklikler de buna dahildir. Etkinlik dinleyicisine iletilen anlık görüntü, alt öğeyle ilgili güncellenmiş verileri içerir. |
FIRDataEventTypeChildRemoved |
Bir listeden öğelerin kaldırılmasını dinleyin. Bu etkinlik, doğrudan bir alt öğe kaldırıldığında tetiklenir.Geri çağırma bloğuna iletilen anlık görüntü, kaldırılan alt öğenin verilerini içerir. |
FIRDataEventTypeChildMoved |
Sıralı bir listedeki öğelerin sırasıyla ilgili değişiklikleri dinleyin.
Bu etkinlik, bir güncelleme alt öğenin yeniden sıralanmasına neden olduğunda tetiklenir. queryOrderedByChild
veya queryOrderedByValue tarafından sıralanan verilerle kullanılır.
|
Bunların her biri, bir veritabanındaki belirli bir düğümde yapılan değişiklikleri dinlemek için yararlı olabilir. Örneğin, bir sosyal blog uygulaması, bir yayındaki yorumlardaki etkinliği izlemek için aşağıdaki gibi bu yöntemleri birlikte kullanabilir:
Swift
// Listen for new comments in the Firebase database commentsRef.observe(.childAdded, with: { (snapshot) -> Void in self.comments.append(snapshot) self.tableView.insertRows( at: [IndexPath(row: self.comments.count - 1, section: self.kSectionComments)], with: UITableView.RowAnimation.automatic ) }) // Listen for deleted comments in the Firebase database commentsRef.observe(.childRemoved, with: { (snapshot) -> Void in let index = self.indexOfMessage(snapshot) self.comments.remove(at: index) self.tableView.deleteRows( at: [IndexPath(row: index, section: self.kSectionComments)], with: UITableView.RowAnimation.automatic ) })
Objective-C
// Listen for new comments in the Firebase database [_commentsRef observeEventType:FIRDataEventTypeChildAdded withBlock:^(FIRDataSnapshot *snapshot) { [self.comments addObject:snapshot]; [self.tableView insertRowsAtIndexPaths:@[ [NSIndexPath indexPathForRow:self.comments.count - 1 inSection:kSectionComments] ] withRowAnimation:UITableViewRowAnimationAutomatic]; }]; // Listen for deleted comments in the Firebase database [_commentsRef observeEventType:FIRDataEventTypeChildRemoved withBlock:^(FIRDataSnapshot *snapshot) { int index = [self indexOfMessage:snapshot]; [self.comments removeObjectAtIndex:index]; [self.tableView deleteRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:index inSection:kSectionComments]] withRowAnimation:UITableViewRowAnimationAutomatic]; }];
Değer etkinliklerini dinleme
Veri listelerini okumanın önerilen yolu alt etkinlikleri dinlemek olsa da liste referansında değer etkinliklerini dinlemenin yararlı olduğu durumlar vardır.
Bir veri listesine FIRDataEventTypeValue
gözlemci eklediğinizde, veri listesinin tamamı tek bir DataSnapshot olarak döndürülür. Ardından, tek tek alt öğelere erişmek için bu veri türüne dönebilirsiniz.
Sorgu için tek bir eşleşme olsa bile anlık görüntü yine de bir listedir ve yalnızca tek bir öğe içerir. Öğeye erişmek için sonucu döngü içinde incelemeniz gerekir:
Swift
_commentsRef.observe(.value) { snapshot in for child in snapshot.children { ... } }
Objective-C
[_commentsRef observeEventType:FIRDataEventTypeValue withBlock:^(FIRDataSnapshot *snapshot) { // Loop over children NSEnumerator *children = [snapshot children]; FIRDataSnapshot *child; while (child = [children nextObject]) { // ... } }];
Bu kalıp, başka alt etkinlikleri dinlemek yerine bir listenin tüm alt öğelerini tek bir işlemde getirmek istediğinizde kullanışlı olabilir.
Verileri sıralama ve filtreleme
Anahtara, değere veya bir alt öğenin değerine göre sıralanmış verileri almak için Realtime Database FIRDatabaseQuery
sınıfını kullanabilirsiniz. Sıralanan sonucu belirli sayıda sonuç veya anahtar ya da değer aralığına göre de filtreleyebilirsiniz.
Verileri sırala
Sıralı verileri almak için sonuçların nasıl sıralandığını belirlemek üzere sıralama yöntemlerinden birini belirterek başlayın:
Yöntem | Kullanım |
---|---|
queryOrderedByKey
| Sonuçları alt anahtarlara göre sıralayın. |
queryOrderedByValue |
Sonuçları alt öğe değerlerine göre sıralayın. |
queryOrderedByChild |
Sonuçları, belirtilen bir alt anahtarın veya iç içe yerleştirilmiş alt yolun değerine göre sıralayın. |
Aynı anda yalnızca bir sıralama yöntemi kullanabilirsiniz. Sıralama yönteminin aynı sorgu içinde birden çok kez çağrılması hata verir.
Aşağıdaki örnek, bir kullanıcının yıldız sayısına göre sıralanmış en popüler yayınlarının listesini nasıl alabileceğinizi gösterir:
Swift
// My top posts by number of stars let myTopPostsQuery = ref.child("user-posts").child(getUid()).queryOrdered(byChild: "starCount")
Objective-C
// My top posts by number of stars FIRDatabaseQuery *myTopPostsQuery = [[[self.ref child:@"user-posts"] child:[super getUid]] queryOrderedByChild:@"starCount"];
Bu sorgu, kullanıcının yayınlarını veritabanındaki yoldan kullanıcı kimliklerine göre alır ve her yayının aldığı yıldız sayısına göre sıralar. Kimlikleri dizin anahtarı olarak kullanma tekniğine veri dağıtımı denir. Bu konu hakkında daha fazla bilgiyi Veritabanınızı Yapılandırma başlıklı makalede bulabilirsiniz.
queryOrderedByChild
yönteminin çağrısı, sonuçların sıralanması için alt anahtarı belirtir. Bu örnekte, gönderiler her gönderideki "starCount"
alt öğesinin değerine göre sıralanır. Sorgular, aşağıdaki gibi verilere sahip olmanız durumunda iç içe yerleştirilmiş alt öğelere göre de sıralanabilir:
"posts": { "ts-functions": { "metrics": { "views" : 1200000, "likes" : 251000, "shares": 1200, }, "title" : "Why you should use TypeScript for writing Cloud Functions", "author": "Doug", }, "android-arch-3": { "metrics": { "views" : 900000, "likes" : 117000, "shares": 144, }, "title" : "Using Android Architecture Components with Firebase Realtime Database (Part 3)", "author": "Doug", } },
Bu durumda, queryOrderedByChild
çağrımızda iç içe yerleştirilmiş alt öğenin göreli yolunu belirterek liste öğelerimizi metrics
anahtarının altına yerleştirilmiş değerlere göre sıralayabiliriz.
Swift
let postsByMostPopular = ref.child("posts").queryOrdered(byChild: "metrics/views")
Objective-C
FIRDatabaseQuery *postsByMostPopular = [[ref child:@"posts"] queryOrderedByChild:@"metrics/views"];
Diğer veri türlerinin nasıl sıralandığı hakkında daha fazla bilgi için Sorgu verilerinin sıralaması başlıklı makaleyi inceleyin.
Veri filtreleme
Verileri filtrelemek için sorgu oluştururken sınır veya aralık yöntemlerinden herhangi birini bir sıralama yöntemiyle birleştirebilirsiniz.
Yöntem | Kullanım |
---|---|
queryLimitedToFirst |
Sıralı sonuç listesinin başından döndürülecek maksimum öğe sayısını belirler. |
queryLimitedToLast |
Sıralı sonuç listesinin sonundan döndürülecek maksimum öğe sayısını belirler. |
queryStartingAtValue |
Seçilen sıralama yöntemine bağlı olarak, belirtilen anahtar veya değerden büyük veya bu değere eşit öğeleri döndürme |
queryStartingAfterValue |
Seçilen sıralama yöntemine bağlı olarak, belirtilen anahtar veya değerden büyük öğeleri döndürme |
queryEndingAtValue |
Seçilen sıralama yöntemine bağlı olarak, belirtilen anahtar veya değerden düşük ya da ona eşit öğeleri döndürme |
queryEndingBeforeValue |
Seçilen sıralama yöntemine bağlı olarak, belirtilen anahtar veya değerden düşük öğeleri döndürme |
queryEqualToValue |
Seçilen sıralama yöntemine bağlı olarak, belirtilen anahtara veya değere eşit öğeleri döndürme |
Sıralama ölçütü yöntemlerinden farklı olarak birden çok sınırlama veya aralık işlevini birleştirebilirsiniz.
Örneğin, sonuçları belirli bir değer aralığına sınırlamak için queryStartingAtValue
ve queryEndingAtValue
yöntemlerini birleştirebilirsiniz.
Sonuç sayısını sınırlama
Belirli bir geri çağırma işlemi için senkronize edilecek maksimum alt öğe sayısını ayarlamak için queryLimitedToFirst
ve queryLimitedToLast
yöntemlerini kullanabilirsiniz. Örneğin, 100 sınırı belirlemek için queryLimitedToFirst
kullanırsanız başlangıçta yalnızca 100'e kadar FIRDataEventTypeChildAdded
geri çağırma alırsınız. Firebase veritabanınızda 100'den az öğe depolanıyorsa her öğe için bir FIRDataEventTypeChildAdded
geri çağırma işlevi tetiklenir.
Öğeler değiştikçe, toplam sayının 100'de kalması için sorguya giren öğeler için FIRDataEventTypeChildAdded
geri çağırma ve sorgudan çıkan öğeler için FIRDataEventTypeChildRemoved
geri çağırma alırsınız.
Aşağıdaki örnekte, örnek bir blog uygulamasının tüm kullanıcılar tarafından yapılan en son 100 yayının listesini nasıl alabileceği gösterilmektedir:
Swift
// Last 100 posts, these are automatically the 100 most recent // due to sorting by push() keys let recentPostsQuery = (ref?.child("posts").queryLimited(toFirst: 100))!
Objective-C
// Last 100 posts, these are automatically the 100 most recent // due to sorting by push() keys FIRDatabaseQuery *recentPostsQuery = [[self.ref child:@"posts"] queryLimitedToFirst:100];
Anahtara veya değere göre filtreleme
Sorgular için rastgele başlangıç, bitiş ve eşdeğerlik noktaları seçmek üzere queryStartingAtValue
, queryStartingAfterValue
, queryEndingAtValue
, queryEndingBeforeValue
ve queryEqualToValue
politikalarını kullanabilirsiniz. Bu, verileri sayfalara ayırmak veya belirli bir değere sahip alt öğeleri olan öğeleri bulmak için yararlı olabilir.
Sorgu verilerinin sıralama şekli
Bu bölümde, verilerin FIRDatabaseQuery
sınıfındaki sıralama yöntemlerine göre nasıl sıralandığı açıklanmaktadır.
queryOrderedByKey
Verilerinizi sıralamak için queryOrderedByKey
kullanıldığında veriler, anahtara göre artan düzende döndürülür.
- 32 bitlik tam sayı olarak ayrıştırılabilen bir anahtara sahip alt öğeler önce gelir ve artan düzende sıralanır.
- Anahtarlarında dize değeri olan alt öğeler sıradaki sırayla, sözlüksel olarak artan düzende sıralanır.
queryOrderedByValue
queryOrderedByValue
kullanılırken alt öğeler değerlerine göre sıralanır. Sıralama ölçütleri, belirtilen alt anahtarın değeri yerine düğümün değeri kullanıldığı dışında queryOrderedByChild
ile aynıdır.
queryOrderedByChild
queryOrderedByChild
kullanıldığında, belirtilen alt anahtarı içeren veriler aşağıdaki gibi sıralanır:
- Belirtilen alt anahtarda
nil
değerine sahip olan alt öğeler önce gelir. - Belirtilen alt anahtar için
false
değerine sahip olan alt öğeler ardından gelir. Birden fazla çocuğun değerifalse
ise anahtara göre alfabetik olarak sıralanır. - Ardından, belirtilen alt anahtar için
true
değerine sahip alt öğeler gelir. Birden fazla alt öğetrue
değerine sahipse bunlar sözlüksel olarak anahtara göre sıralanır. - Ardından, sayısal değere sahip alt öğeler artan düzende sıralanır. Belirtilen alt düğüm için aynı sayısal değere sahip birden fazla alt öğe varsa bunlar anahtara göre sıralanır.
- Dizelerin sırası, sayılardan sonra gelir ve alfabetik olarak artan düzendedir. Belirtilen alt öğe düğümü için birden fazla alt öğe aynı değere sahipse bu öğeler anahtara göre alfabetik olarak sıralanır.
- Nesneler en son gelir ve anahtara göre artan düzende alfabetik olarak sıralanır.
Dinleyicileri kaldırma
ViewController
cihazından ayrıldığınızda gözlemciler veri senkronizasyonunu otomatik olarak durdurmaz. Bir gözlemci düzgün şekilde kaldırılmazsa verileri yerel bellekle senkronize etmeye devam eder ve etkinlik işleyici kapatılırken yakalanan tüm nesneleri saklar. Bu da bellek sızıntılarına neden olabilir. Artık ihtiyaç duyulmayan gözlemcileri, ilişkili FIRDatabaseHandle
öğesini removeObserverWithHandle
yöntemine ileterek kaldırın.
Bir referansa geri çağırma bloğu eklediğinizde FIRDatabaseHandle
döndürülür.
Bu herkese açık kullanıcı adları, geri arama engellemesini kaldırmak için kullanılabilir.
Bir veritabanı referansına birden fazla dinleyici eklendiyse bir etkinlik tetiklendiğinde her dinleyici çağrılır. Bu konumdaki verilerin senkronizasyonunu durdurmak için removeAllObservers
yöntemini çağırarak konumdaki tüm gözlemcileri kaldırmanız gerekir.
Bir dinleyicide removeObserverWithHandle
veya removeAllObservers
çağrısı yapıldığında, dinleyicinin alt düğümlerine kayıtlı dinleyiciler otomatik olarak kaldırılmaz. Bu referansları veya herkese açık kimlikleri kaldırmak için de takip etmeniz gerekir.