取得 FIRDatabaseReference
如要從資料庫讀取或寫入資料,您需要使用
FIRDatabaseReference
:
Swift
var ref: DatabaseReference! ref = Database.database().reference()
Objective-C
@property (strong, nonatomic) FIRDatabaseReference *ref; self.ref = [[FIRDatabase database] reference];
讀取及寫入清單
附加至資料清單
使用 childByAutoId
方法將資料附加至多使用者中的清單
應用程式。childByAutoId
方法會在每次新金鑰時產生專屬金鑰
子元素會加入指定的 Firebase 參考資料。只要使用這些節點
自動產生的索引鍵,可由多個用戶端新增
子項同時複製到相同的位置,不會發生寫入衝突。
childByAutoId
產生的不重複索引鍵依據時間戳記,所以列出項目。
會自動依時間排序。
您可以使用 childByAutoId
方法傳回新資料的參照
來取得自動產生的鍵值,或設定子項的資料。
對 childByAutoId
參照呼叫 getKey
會傳回自動產生的金鑰。
您可以使用這些自動產生的金鑰來簡化資料彙整作業 成本中心的架構詳情請參閱資料擴散傳遞 example)。
監聽子事件
如果容器中發生特定作業,
節點的子項,例如透過
childByAutoId
方法或透過
updateChildValues
方法。
事件類型 | 一般用量 |
---|---|
FIRDataEventTypeChildAdded |
擷取項目清單,或監聽附加項目清單。 系統會為每個現有的子項觸發此事件一次,然後再次 每次將新子項加入指定路徑時,都會產生事件。事件監聽器會 傳送了含有新子項資料的快照。 |
FIRDataEventTypeChildChanged |
監聽清單中項目的變更。每當修改子節點時,就會觸發這個事件。包括對 子項節點的子系傳遞至事件監聽器的快照 包含子發布商的更新資料。 |
FIRDataEventTypeChildRemoved |
監聽已從清單中移除的項目。這個事件會在 會移除立即子項。傳遞至回呼區塊的快照 包含已移除之子帳戶的資料。 |
FIRDataEventTypeChildMoved |
監聽已排序清單中項目順序的變更。
當更新作業將
孩子。可與 queryOrderedByChild
或 queryOrderedByValue 排序的資料搭配使用。
|
當您要監聽特定變更 快取節點舉例來說,社交網誌應用程式可能會使用以下方法 以監控貼文留言的活動,如下所示:
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]; }];
監聽價值事件
雖然監聽子事件是讀取資料清單的建議方式, 在某些情況下,監聽清單參照中的值事件會很實用。
將 FIRDataEventTypeValue
觀察器附加至資料清單時,系統會傳回
並透過單一 DataSnapshot 的形式寫入整份資料清單
存取個別子項
即使查詢只有一個相符結果,快照仍為 清單;只會包含單一項目如要存取該項目,就必須進行迴圈 套用到結果:
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]) { // ... } }];
當您想要擷取清單的所有子項時,這種模式相當實用 視為單一作業,而非監聽額外新增的子項 事件。
排序及篩選資料
您可以使用 Realtime Database FIRDatabaseQuery
類別擷取排序的資料
或子項的值你也可以篩選
在特定數量的結果或索引鍵範圍內排序的結果
輕鬆分配獎金
排序資料
如要擷取經過排序的資料,請先指定其中一種排序方法,以便 決定結果的排序方式:
方法 | 用量 |
---|---|
queryOrderedByKey
| 按子項鍵排序結果。 |
queryOrderedByValue |
按照子項值排序結果。 |
queryOrderedByChild |
按指定子項鍵或巢狀子路徑的值排序結果。 |
一次只能使用「一個」排序方法。依訂單呼叫方法 重複計算錯誤。
以下範例說明如何擷取使用者的 熱門訊息會按照星級評等排序:
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"];
這個查詢會根據以下項目,從資料庫的路徑中擷取使用者的文章: 使用者 ID 按照每則貼文獲得的星星數量排序。這個 使用 ID 做為索引鍵的技術「資料擴散傳遞」 深入瞭解 建立資料庫。
queryOrderedByChild
方法的呼叫會指定要排序的子項鍵
然後進一步細分在這個範例中,貼文排序依據為
每則貼文中有 "starCount"
位兒童。查詢也可以按照巢狀結構排序
子項的資料如下:
"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", } },
在此情況下,我們可以根據
metrics
鍵,方法是在
queryOrderedByChild
呼叫。
Swift
let postsByMostPopular = ref.child("posts").queryOrdered(byChild: "metrics/views")
Objective-C
FIRDatabaseQuery *postsByMostPopular = [[ref child:@"posts"] queryOrderedByChild:@"metrics/views"];
如要進一步瞭解其他資料類型的排序方式, 請參閱查詢資料的排序方式。
篩選資料
如要篩選資料,可以使用任何限製或範圍方法, 依順序排序查詢。
方法 | 用量 |
---|---|
queryLimitedToFirst |
設定從 結果的排序清單。 |
queryLimitedToLast |
設定從訂單結尾傳回的項目數量上限 結果清單。 |
queryStartingAtValue |
傳回大於或等於指定鍵/值的項目。 視所選的訂單而定 |
queryStartingAfterValue |
傳回大於指定鍵或值的項目, 視所選的訂單而定 |
queryEndingAtValue |
傳回小於或等於指定鍵/值的項目; 視所選的訂單而定 |
queryEndingBeforeValue |
傳回小於指定鍵或值的項目; 視所選的訂單而定 |
queryEqualToValue |
根據 。 |
有別於逐一排序的方法,您可以合併多個限製或範圍函式。
例如,您可以結合 queryStartingAtValue
和 queryEndingAtValue
方法
將結果傳回指定範圍內的值
限制結果數量
您可以使用 queryLimitedToFirst
和 queryLimitedToLast
方法設定
要為特定回呼同步處理的子項數量上限。舉例來說
您使用 queryLimitedToFirst
將限制設為 100,一開始只會接收
至 100 個 FIRDataEventTypeChildAdded
回呼。如果您儲存的項目少於 100 個
Firebase 資料庫,每個項目都會觸發 FIRDataEventTypeChildAdded
回呼。
當項目變更時,系統會針對輸入值的項目接收 FIRDataEventTypeChildAdded
回呼
以及 FIRDataEventTypeChildRemoved
回呼,
總數會維持在 100
以下範例示範網誌應用程式如何擷取 所有使用者最新發布的 100 篇清單:
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];
依鍵或值篩選
您可以使用 queryStartingAtValue
、queryStartingAfterValue
、
queryEndingAtValue
、queryEndingBeforeValue
和 queryEqualToValue
可選擇任意的起始、結束和等價點,以便執行查詢作業。這個
很適合用於將資料分頁或找出具有子項
特定值。
查詢資料的排序方式
本節會說明
FIRDatabaseQuery
類別。
queryOrderedByKey
使用 queryOrderedByKey
排序資料時,系統會以遞增順序傳回資料
。
- 如果子項的索引鍵可剖析為 32 位元整數,其內容會先以遞增順序排序。
- 具有字串值做為索引鍵的下一個子項,並依字母順序遞增排序。
queryOrderedByValue
使用 queryOrderedByValue
時,子項會按照值的順序排列。順序
條件與 queryOrderedByChild
相同,但節點值
,而不是指定子鍵的值。
queryOrderedByChild
使用 queryOrderedByChild
時,包含指定子項鍵的資料將會是
排序如下:
- 針對指定子項鍵有
nil
值的子項,如下所示 首先。 - 指定子鍵值為
false
的子項 取得下一個提示如果多個子項的值為false
,這些子項就會 依鍵字母順序排序。 - 指定子鍵值為
true
的子項 取得下一個提示如果多個子項的值為true
,這些子項就會 依索引鍵字母順序排列 - 含有數值的子項接著會以遞增順序排序。如果 多個子項的數值相同 節點,按鍵排序。
- 字串是由數字後方,並依字母順序遞增 順序。如果多個子項具有相同的值 節點的節點,按照鍵的字母順序排列。
- 物件在最後,且依鍵的字母順序依遞增順序排列。
卸離事件監聽器
您離開
ViewController
。如果未正確移除觀測器,該觀察器會繼續同步處理
資料傳到本機記憶體,並會保留事件處理常式所擷取的任何物件
關閉可能會導致記憶體流失。不再需要觀察器時
方法是將相關聯的 FIRDatabaseHandle
傳遞至
removeObserverWithHandle
方法。
在參照中新增回呼區塊時,系統會傳回 FIRDatabaseHandle
。
這些控點可用於移除回呼區塊。
如果已在資料庫參照中新增多個事件監聽器,則每個事件監聽器都會
則會在引發事件時呼叫。如要停止同步處理該位置的資料,
您必須呼叫 removeAllObservers
來移除位置中的所有觀察器
方法。
在事件監聽器上呼叫 removeObserverWithHandle
或 removeAllObservers
會
不會自動移除在子節點上註冊的事件監聽器;你還需要
追蹤這些參考檔案或帳號代碼,以便予以移除