FIRDatabaseReference alma
Veri tabanından veri okumak veya veri tabanına veri 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 alt öğe eklendiğinde benzersiz bir anahtar oluşturur. Listedeki her yeni öğe için bu otomatik olarak oluşturulan anahtarları kullanarak birden fazla istemci, yazma çakışmaları olmadan aynı anda aynı konuma alt öğeler ekleyebilir. childByAutoId
tarafından oluşturulan benzersiz anahtar, zaman damgasına dayalıdır. Bu nedenle, liste öğeleri otomatik olarak kronolojik sıraya göre sıralanır.
childByAutoId
yöntemi tarafından döndürülen yeni verilere yapılan referansı kullanarak çocuğun otomatik olarak oluşturulan anahtarının değerini alabilir veya çocuk için veri ayarlayabilirsiniz.
childByAutoId
referansında getKey
çağrısı, otomatik olarak oluşturulan anahtarı döndürür.
Veri yapınızı düzleştirme işlemini basitleştirmek için bu otomatik olarak oluşturulan anahtarları kullanabilirsiniz. Daha fazla bilgi için veri dağıtımı örneğini inceleyin.
Alt etkinliklerini dinleme
Çocuk etkinlikleri, bir düğümün çocuklarında meydana gelen belirli işlemlere yanıt olarak tetiklenir. Örneğin, childByAutoId
yöntemiyle yeni bir çocuk eklenmesi veya updateChildValues
yöntemiyle bir çocuğun güncellenmesi gibi işlemler.
Etkinlik türü | Tipik kullanım |
---|---|
FIRDataEventTypeChildAdded |
Öğe listelerini alma veya öğe listesine eklenenleri dinleme Bu etkinlik, mevcut her alt öğe için bir kez, ardından belirtilen yola yeni bir alt öğe eklendiğinde tekrar tetiklenir. Dinleyiciye, yeni alt öğenin verilerini içeren bir anlık görüntü iletilir. |
FIRDataEventTypeChildChanged |
Bir listedeki öğelerde yapılan değişiklikleri dinleme. Bu etkinlik, bir alt düğüm her değiştirildiğinde tetiklenir. Çocuk düğümünün alt öğelerinde yapılan tüm değişiklikler buna dahildir. Etkinlik işleyicisine iletilen anlık görüntü, alt öğeyle ilgili güncellenmiş verileri içerir. |
FIRDataEventTypeChildRemoved |
Bir listeden kaldırılan öğeleri 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ı listedeki öğelerin sırasıyla ilgili değişiklikleri dinleyin.
Bu etkinlik, bir güncelleme nedeniyle çocuğun yeniden sıralanmasına neden olduğunda tetiklenir. queryOrderedByChild
veya queryOrderedByValue 'ya göre sıralanmış 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 gönderinin yorumlarındaki etkinliği izlemek için 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 okumak için alt etkinlikleri dinlemek önerilen yöntem olsa da liste referansındaki değer etkinliklerini dinlemenin faydalı olduğu durumlar vardır.
Bir veri listesine FIRDataEventTypeValue
gözlemci eklemek, tüm veri listesini tek bir DataSnapshot olarak döndürür. Daha sonra tek tek alt öğelere erişmek için bu listede döngü oluşturabilirsiniz.
Sorgu için yalnızca tek bir eşleşme olsa bile anlık görüntü yine bir listedir. Yalnızca tek bir öğe içerir. Öğeye erişmek için sonucu döngüye almanız 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, ek alt öğe ekleme etkinliklerini dinlemek yerine bir listedeki tüm alt öğeleri tek bir işlemde getirmek istediğinizde faydalı olabilir.
Verileri sıralama ve filtreleme
Anahtara, değere veya alt öğenin değerine göre sıralanmış verileri almak için Realtime Database FIRDatabaseQuery
sınıfını kullanabilirsiniz. Sıralanmış sonucu belirli sayıda sonuç veya bir anahtar ya da değer aralığına göre de filtreleyebilirsiniz.
Verileri sıralama
Sıralanmış verileri almak için sonuçların nasıl sıralanacağını belirlemek üzere order-by 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. Aynı sorguda bir order-by yöntemini birden çok kez çağırmak hataya neden olur.
Aşağıdaki örnekte, bir kullanıcının yıldız sayısına göre sıralanmış en iyi gönderilerinin listesini nasıl alabileceğiniz gösterilmektedir:
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ı kimliğine göre alır ve her yayının aldığı yıldız sayısına göre sıralar. Kimlikleri dizin anahtarları olarak kullanma tekniğine veri dağıtımı adı verilir. Bu teknik hakkında daha fazla bilgiyi Veritabanınızı Yapılandırma bölümünde bulabilirsiniz.
queryOrderedByChild
yöntemine yapılan çağrı, sonuçları sıralamak için kullanılacak alt anahtarı belirtir. Bu örnekte, yayınlar her yayındaki "starCount"
alt öğesinin değerine göre sıralanır. Aşağıdaki gibi verileriniz varsa sorgular 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, metrics
anahtarı altında iç içe yerleştirilmiş değerlere göre liste öğelerimizi sıralayabiliriz. Bunun için queryOrderedByChild
çağrımızda iç içe yerleştirilmiş alt öğeye giden göreli yolu belirtmemiz gerekir.
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 verileri nasıl sıralanır? 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ı ayarlar. |
queryLimitedToLast |
Sıralı sonuç listesinin sonundan döndürülecek maksimum öğe sayısını ayarlar. |
queryStartingAtValue |
Seçilen sıralama yöntemine bağlı olarak, belirtilen anahtardan veya değerden büyük ya da bu anahtara veya değere eşit öğeleri döndürür. |
queryStartingAfterValue |
Sıralama yöntemine bağlı olarak, belirtilen anahtardan veya değerden büyük öğeleri döndürür. |
queryEndingAtValue |
Sıralama yöntemine bağlı olarak, belirtilen anahtardan veya değerden küçük ya da ona eşit öğeleri döndürür. |
queryEndingBeforeValue |
Sıralama yöntemine bağlı olarak, belirtilen anahtardan veya değerden daha küçük öğeleri döndürür. |
queryEqualToValue |
Seçilen sıralama yöntemine bağlı olarak, belirtilen anahtara veya değere eşit öğeleri döndürür. |
Sıralama yöntemlerinden farklı olarak, birden fazla sınır veya aralık işlevini birleştirebilirsiniz.
Örneğin, sonuçları belirli bir değer aralığıyla 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çin senkronize edilecek maksimum alt öğe sayısını ayarlamak üzere 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 FIRDataEventTypeChildAdded
geri araması alırsınız. Firebase veritabanınızda 100'den az öğe depolanıyorsa her öğe için bir FIRDataEventTypeChildAdded
geri çağırma işlemi tetiklenir.
Öğeler değiştikçe sorguya giren öğeler için FIRDataEventTypeChildAdded
, sorgudan çıkan öğeler için FIRDataEventTypeChildRemoved
geri çağırma işlemi alırsınız. Böylece toplam sayı 100 olarak kalır.
Aşağıdaki örnekte, örnek bir blog uygulamasıyla tüm kullanıcıların en son 100 yayınının listesinin nasıl alınabileceğ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
öğelerini kullanabilirsiniz. Bu, verileri sayfalara ayırmak veya belirli bir değere sahip alt öğeleri olan öğeleri bulmak için yararlı olabilir.
Sorgu verilerinin sıralanma şekli
Bu bölümde, verilerin FIRDatabaseQuery
sınıfındaki her bir sıralama yöntemine göre nasıl sıralandığı açıklanmaktadır.
queryOrderedByKey
Verilerinizi sıralamak için queryOrderedByKey
işlevini kullandığınızda veriler, anahtara göre artan düzende döndürülür.
- 32 bitlik bir tam sayı olarak ayrıştırılabilen anahtara sahip çocuklar, artan düzende sıralanarak ilk sırada yer alır.
- Anahtarı dize değeri olan çocuklar, sözlük sıralamasına göre artan düzende sıralanır.
queryOrderedByValue
queryOrderedByValue
kullanılırken çocuklar değerlerine göre sıralanır. Sıralama ölçütleri, queryOrderedByChild
ile aynıdır. Ancak belirtilen bir alt anahtarın değeri yerine düğümün değeri kullanılır.
queryOrderedByChild
queryOrderedByChild
kullanılırken belirtilen alt anahtarı içeren veriler şu şekilde sıralanır:
- Belirtilen çocuk anahtarı için
nil
değeri olan çocuklar önce gelir. - Belirtilen alt anahtar için
false
değerine sahip alt öğeler bir sonraki sırada yer alır. Birden fazla alt öğefalse
değerine sahipse anahtara göre sözlük sırasına göre sıralanır. - Belirtilen alt anahtar için
true
değerine sahip alt öğeler bir sonraki sırada yer alır. Birden fazla alt öğenin değeritrue
ise bunlar anahtara göre sözlük sırasına göre sıralanır. - Sayısal değere sahip çocuklar, artan düzende sıralanarak gösterilir. Belirtilen alt düğüm için birden fazla alt öğe aynı sayısal değere sahipse bunlar anahtara göre sıralanır.
- Dizeler sayılardan sonra gelir ve sözlük sırasına göre artan düzende sıralanır. Belirtilen alt düğüm için birden fazla alt öğe aynı değere sahipse bunlar anahtara göre sözlük sırasına göre sıralanır.
- Nesneler en sona gelir ve anahtara göre artan sözlük sıralamasıyla sıralanır.
Dinleyicileri ayırma
Gözlemciler, ViewController
'dan ayrıldığınızda verileri otomatik olarak senkronize etmeyi durdurmaz. Bir gözlemci düzgün şekilde kaldırılmazsa verileri yerel belleğe senkronize etmeye devam eder ve etkinlik işleyici kapatmasında yakalanan tüm nesneleri korur. Bu durum, bellek sızıntılarına neden olabilir. Artık ihtiyaç duyulmayan bir gözlemciyi, ilişkili FIRDatabaseHandle
öğesini removeObserverWithHandle
yöntemine ileterek kaldırın.
Bir referansa geri arama bloğu eklediğinizde FIRDatabaseHandle
döndürülür.
Bu tutma yerleri, geri arama engelini kaldırmak için kullanılabilir.
Bir veritabanı referansına birden fazla dinleyici eklenmişse bir etkinlik oluşturulduğunda 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ı yapmak, alt düğümlerine kayıtlı dinleyicileri otomatik olarak kaldırmaz. Bu dinleyicileri kaldırmak için bu referansları veya tutamaçları da takip etmeniz gerekir.