FIRDatabaseReference alma
Veritabanından veri okumak veya yazmak için FIRDatabaseReference
örneğinin olması gerekir:
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 ekle
Ç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 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 yayıncının otomatik olarak oluşturulan anahtarın değerini almak veya alt öğe için verileri ayarlamak üzere childByAutoId
yöntemi tarafından döndürülen yeni verilere 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üzeltmeyi basitleştirmek için otomatik olarak oluşturulan bu anahtarları kullanabilirsiniz. Daha fazla bilgi için veri yayma örneğine bakın.
Çocuk etkinliklerini dinle
Alt etkinlikler, childByAutoId
yöntemiyle eklenen yeni bir alt öğe veya updateChildValues
yöntemiyle güncellenen bir alt öğe gibi bir işlemdeki düğümün alt öğelerine yapılan belirli işlemlere 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 belirtilen yola her yeni alt öğe eklendiğinde tekrar tetiklenir. İşleyiciye, yeni alt öğenin verilerini içeren bir anlık görüntü iletilir. |
FIRDataEventTypeChildChanged |
Listedeki öğelerde yapılan değişiklikleri bekleyin. Bu etkinlik, bir alt düğüm her değiştirildiğinde tetiklenir. Alt düğümün alt öğelerinde yapılan değişiklikler de buna dahildir. Etkinlik işleyiciye iletilen anlık görüntü, alt öğeye ait güncellenmiş verileri içerir. |
FIRDataEventTypeChildRemoved |
Bir listeden kaldırılan öğeleri bekleyin. Bu etkinlik, hemen bir alt öğe kaldırıldığında tetiklenir.Geri çağırma blokuna iletilen anlık görüntü, kaldırılan alt öğeye ait verileri içerir. |
FIRDataEventTypeChildMoved |
Sıralı listedeki öğelerin sırasındaki değişiklikleri bekleyin.
Bir güncelleme, alt öğenin yeniden sıralanmasına neden olduğunda bu etkinlik tetiklenir. queryOrderedByChild
veya queryOrderedByValue bazında sıralanan verilerle kullanılır.
|
Bunların her biri, veritabanındaki belirli bir düğümde yapılan değişiklikleri dinlemek için faydalı olabilir. Örneğin, bir sosyal blog uygulaması bir yayının yorumlarındaki etkinliği izlemek için aşağıda gösterildiği 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 etkinliklerine göz atın
Veri listelerini okumak için alt etkinlikleri dinlemek önerilen yöntemdir ancak bir liste referansındaki değer etkinliklerini dinlemenin kullanışlı olduğu durumlar da vardır.
Bir veri listesine FIRDataEventTypeValue
gözlemleyicisi eklendiğinde, veri listesinin tamamı tek bir DataSnapshot halinde döndürülür. Daha sonra bu bilgileri tek tek alt öğelere erişmek için devre dışı bırakabilirsiniz.
Sorgu için tek bir eşleşme olsa bile anlık görüntü yine de bir liste olarak kalır ve yalnızca tek bir öğe içerir. Öğeye erişmek için sonucun üstünden geçmeniz 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
Verileri anahtara, değere veya bir alt öğenin değerine göre sıralanmış şekilde 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ıralanmış verileri almak için öncelikle sonuçların nasıl sıralandığını belirlemek üzere sıralama yöntemlerinden birini belirtin:
Yöntem | Kullanım |
---|---|
queryOrderedByKey
| Sonuçları alt anahtarlara göre sıralayın. |
queryOrderedByValue |
Sonuçları alt değerlere 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. Bir sıralama yönteminin aynı sorguda birden çok kez çağrılması hataya neden olur.
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ı kullanıcı kimliğine göre veritabanındaki yoldan alır. Bu sıralama, her yayının aldığı yıldız sayısına göre sıralanır. Kimlikleri dizin anahtarı olarak kullanma tekniği "veri yayma" olarak adlandırılır. 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ın sıralanacağı alt anahtarı belirtir. Bu örnekte yayınlar, her yayındaki "starCount"
alt öğesinin değerine göre sıralanır. Sorgular, aşağıdaki gibi görünen verileriniz olması 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 örnekte, queryOrderedByChild
çağrımızda iç içe yerleştirilmiş alt öğenin göreli yolunu belirterek liste öğelerimizi metrics
anahtarı altında iç içe 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 verileri nasıl sıralanır? bölümüne bakın.
Veri filtreleme
Verileri filtrelemek için bir sorgu oluştururken sınır veya aralık yöntemlerinden herhangi birini tek bir sıralama yöntemiyle birleştirebilirsiniz.
Yöntem | Kullanım |
---|---|
queryLimitedToFirst |
Sıralı sonuç listesinin başlangıcından itibaren 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 anahtar veya değerden büyük veya ona eşit olan öğeleri döndürün. |
queryStartingAfterValue |
Seçilen yönteme göre belirlenen yönteme göre, belirtilen anahtar veya değerden daha yüksek olan öğeleri döndürür. |
queryEndingAtValue |
Seçilen sıralama yöntemine bağlı olarak, belirtilen anahtar veya değerden düşük veya ona eşit olan öğeleri döndürün. |
queryEndingBeforeValue |
Seçilen yönteme göre belirlenen yönteme göre, belirtilen anahtar veya değerden daha düşük olan öğeleri döndürür. |
queryEqualToValue |
Seçilen sıralama yöntemine bağlı olarak, belirtilen anahtar veya değere eşit öğeleri döndürür. |
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ığıyla sınırlamak için queryStartingAtValue
ve queryEndingAtValue
yöntemlerini birleştirebilirsiniz.
Sonuç sayısını sınırlandırın
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 en fazla 100 FIRDataEventTypeChildAdded
geri çağırması alırsınız. Firebase veritabanınızda depolanan öğe sayısı 100'den azsa her öğe için FIRDataEventTypeChildAdded
geri çağırması etkinleşir.
Öğeler değiştikçe sorguya giren öğeler için FIRDataEventTypeChildAdded
geri çağırma, sorgudan çıkan öğeler için ise FIRDataEventTypeChildRemoved
geri çağırma alırsınız. Böylece toplam sayı 100'de kalır.
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];
Anahtar veya değere göre filtreleyin
Sorgular için rastgele başlangıç, bitiş ve denklik noktalarını seçmek amacıyla queryStartingAtValue
, queryStartingAfterValue
, queryEndingAtValue
, queryEndingBeforeValue
ve queryEqualToValue
tuşlarını kullanabilirsiniz. Bu, verileri sayfalara ayırırken veya çocuklara yönelik belirli bir değeri olan öğeleri bulurken faydalı olabilir.
Sorgu verileri nasıl sıralanır?
Bu bölümde, verilerin FIRDatabaseQuery
sınıfındaki her bir yönteme göre nasıl sıralandığı açıklanmaktadır.
queryOrderedByKey
Verilerinizi sıralamak için queryOrderedByKey
kullandığınızda veriler, anahtara göre artan düzende döndürülür.
- 32 bit tam sayı olarak ayrıştırılabilen bir anahtarı olan 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 queryOrderedByChild
ile aynıdır. Tek fark, belirtilen alt anahtarın değeri yerine düğümün değerinin kullanılmasıdır.
queryOrderedByChild
queryOrderedByChild
kullanılırken 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 alt öğefalse
değerine sahipse bunlar anahtara göre sözlüksel olarak sıralanır. - Belirtilen alt anahtar için
true
değerine sahip olan alt öğeler ardından gelir. Birden fazla alt öğetrue
değerine sahipse bunlar sözlüksel olarak anahtara göre sıralanır. - Sayısal değere sahip olan 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.
- Dizeler sayılardan sonra gelir ve sözlüksel olarak artan düzende sıralanır. Birden fazla alt düğüm, belirtilen alt düğüm için aynı değere sahipse bunlar sözlüksel olarak anahtara göre sıralanır.
- Nesneler son sırada gelir ve anahtara göre sözlüksel olarak artan düzende sıralanır.
Dinleyicileri ayır
ViewController
cihazından ayrıldığınızda gözlemciler veri senkronizasyonunu otomatik olarak durdurmaz. Gözlemci düzgün şekilde kaldırılmazsa verileri yerel belleğe senkronize etmeye devam eder ve etkinlik işleyici kapatma işleminde yakalanan nesneleri saklar. Bu da bellek sızıntılarına neden olabilir. Bir gözlemciye artık ihtiyaç duyulmadığında ilişkili FIRDatabaseHandle
öğesini removeObserverWithHandle
yöntemine ileterek gözlemciyi kaldırın.
Bir referansa geri arama bloğu eklediğinizde FIRDatabaseHandle
döndürülür.
Bu herkese açık kullanıcı adları, geri çağırma engellemesini kaldırmak için kullanılabilir.
Veritabanı referansına birden fazla işleyici eklenmişse bir etkinlik oluşturulduğunda her işleyici çağrılır. Bu konumdaki verilerin senkronizasyonunu durdurmak için removeAllObservers
yöntemini çağırarak bir konumdaki tüm gözlemcileri kaldırmanız gerekir.
Bir işleyicide removeObserverWithHandle
veya removeAllObservers
çağrılması, alt düğümlerinde kayıtlı işleyicileri otomatik olarak kaldırmaz. Ayrıca, bunları kaldırmak için bu referansları veya herkese açık kullanıcı adlarını da takip etmeniz gerekir.