獲取數據庫參考
要從數據庫讀取或寫入數據,您需要一個firebase.database.Reference
實例:
var database = firebase.database();
讀寫清單
附加到數據列表
使用push()
方法將數據追加到多用戶應用程序中的列表中。每當將新的子級添加到指定的Firebase引用中時, push()
方法都會生成一個唯一鍵。通過為列表中的每個新元素使用這些自動生成的鍵,多個客戶端可以同時將子代添加到同一位置,而不會發生寫衝突。 push()
生成的唯一鍵是基於時間戳的,因此列表項將按時間順序自動排序。
您可以使用對push()
方法返回的新數據的引用來獲取子項的自動生成鍵的值或為子項設置數據。 push()
引用的.key
屬性包含自動生成的鍵。
您可以使用這些自動生成的鍵來簡化扁平化數據結構。有關更多信息,請參見數據扇出示例。
例如, push()
可用於在社交應用程序的帖子列表中添加新帖子:
// Create a new post reference with an auto-generated id var postListRef = firebase.database().ref('posts'); var newPostRef = postListRef.push(); newPostRef.set({ // ... });
聽兒童活動
子事件是響應某個操作(例如通過push()
方法添加的新子項或通過update()
方法update()
的子項push()
對節點的子項發生的特定操作而觸發的。
事件 | 典型用法 |
---|---|
child_added | 檢索項目列表或收聽對項目列表的添加。為每個現有子項觸發一次此事件,然後每次將新子項添加到指定路徑時再次觸發。向偵聽器傳遞一個包含新子數據的快照。 |
child_changed | 偵聽列表中項目的更改。修改子節點時,都會觸發此事件。這包括對子節點後代的任何修改。傳遞給事件偵聽器的快照包含子項的更新數據。 |
child_removed | 偵聽從列表中刪除的項目。刪除直接子級時觸發此事件。傳遞給回調塊的快照包含已刪除子級的數據。 |
child_moved | 收聽對有序列表中項目順序的更改。 child_moved 事件始終跟在child_changed 事件之後,該事件導致商品的訂單發生更改(基於您當前的order-by方法)。 |
這些中的每一個都可以用於偵聽數據庫中特定節點的更改。例如,社交博客應用程序可能一起使用這些方法來監視帖子評論中的活動,如下所示:
var commentsRef = firebase.database().ref('post-comments/' + postId); commentsRef.on('child_added', (data) => { addCommentElement(postElement, data.key, data.val().text, data.val().author); }); commentsRef.on('child_changed', (data) => { setCommentValues(postElement, data.key, data.val().text, data.val().author); }); commentsRef.on('child_removed', (data) => { deleteComment(postElement, data.key); });
聆聽價值事件
雖然偵聽子事件是讀取數據列表的推薦方法,但是在某些情況下,偵聽列表引用中的值事件很有用。
將value
觀察器附加到數據列表將以單個快照的形式返回整個數據列表,然後可以循環訪問單個子級。
即使查詢只有一個匹配項,快照仍是一個列表。它只包含一個項目。要訪問該項目,您需要遍歷結果:
ref.once('value', (snapshot) => { snapshot.forEach((childSnapshot) => { var childKey = childSnapshot.key; var childData = childSnapshot.val(); // ... }); });
當您想在單個操作中獲取列表的所有子項,而不是偵聽其他已添加子項的事件時,此模式很有用。
排序和過濾數據
您可以使用Realtime Database Query
類檢索按鍵,按值或按子項值排序的數據。您還可以將排序的結果過濾為特定數目的結果或一定範圍的鍵或值。
排序數據
要檢索排序的數據,請先指定一種排序方法來確定結果的排序方式:
方法 | 用法 |
---|---|
orderByChild() | 按指定的子鍵或嵌套子路徑的值對結果進行排序。 | orderByKey() | 通過子鍵訂購結果。 |
orderByValue() | 按子值排序結果。 |
您一次只能使用一種訂購方式。在同一查詢中多次調用order-by方法會引發錯誤。
以下示例演示瞭如何檢索按用戶星數排序的用戶熱門帖子列表:
var myUserId = firebase.auth().currentUser.uid; var topUserPostsRef = firebase.database().ref('user-posts/' + myUserId).orderByChild('starCount');
這定義了一個查詢,當與子偵聽器結合使用時,該查詢將根據客戶端的用戶ID將客戶端與數據庫路徑中的用戶帖子同步,並按每個帖子收到的星數排序。這種將ID用作索引鍵的技術稱為數據扇出,您可以在“數據庫結構”中閱讀有關它的更多信息。
對orderByChild()
方法的調用指定了對結果進行排序的子項。在這種情況下,帖子按其各自"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", } },
在這種情況下,我們可以通過在orderByChild()
調用中指定嵌套子項的相對路徑,通過嵌套在metrics
鍵下的值對列表元素進行orderByChild()
。
var mostViewedPosts = firebase.database().ref('posts').orderByChild('metrics/views');
有關如何排序其他數據類型的更多信息,請參見查詢數據的排序方式。
篩選資料
要過濾數據,可以在構造查詢時將任何limit或range方法與order-by方法結合使用。
方法 | 用法 |
---|---|
limitToFirst() | 設置從有序結果列表的開頭返回的最大項目數。 |
limitToLast() | 設置要從已排序結果列表的末尾返回的最大項目數。 |
startAt() | 根據選擇的排序方式,返回大於或等於指定鍵或值的項目。 |
endAt() | 根據選擇的排序方式,返回小於或等於指定鍵或值的項目。 |
equalTo() | 根據選擇的排序方法,返回等於指定鍵或值的項目。 |
與order-by方法不同,您可以組合多個限製或範圍函數。例如,您可以結合使用startAt()
和endAt()
方法來將結果限制為指定的值範圍。
限制結果數
您可以使用limitToFirst()
和limitToLast()
方法來設置給定事件要同步的最大子limitToLast()
。例如,如果使用limitToFirst()
將限制設置為100,則最初最多只能接收100個child_added
事件。如果您在Firebase數據庫中存儲的項目少於100個, child_added
為每個項目觸發child_added
事件。
隨著項目的變化,您會收到child_added
事件即進入查詢和物品child_removed
事件,在100它的輟學,使總數停留項目。
以下示例演示了示例博客應用程序如何定義查詢以檢索所有用戶的100條最新帖子的列表:
var recentPostsRef = firebase.database().ref('posts').limitToLast(100);
本示例僅定義一個查詢,以實際同步需要具有附加偵聽器的數據。
按鍵或值過濾
您可以使用startAt()
, endAt()
和equalTo()
來選擇查詢的任意起點,終點和等價點。這對於對數據進行分頁或查找具有特定值的子項的項目很有用。
查詢數據如何排序
本節說明如何通過Query
類中的每個order-by方法對數據進行排序。
orderByChild
使用orderByChild()
,包含指定子鍵的數據按以下順序排序:
- 指定的子項的值為
null
的子項優先。 - 接下來是指定子項的值為
false
的子項。如果多個子項的值為false
,則按字母順序對它們進行排序。 - 接下來是指定子項的值為
true
的子項。如果多個子項的值為true
,則按字母順序對它們進行排序。 - 接下來是帶有數字值的子級,以升序排列。如果指定的子節點的多個子節點具有相同的數值,則按鍵對它們進行排序。
- 字符串緊隨數字之後,並按字典順序升序排序。如果多個子節點在指定的子節點上具有相同的值,則按字母順序對它們進行排序。
- 對象排在最後,並按鍵順序從小到大按字母順序排序。
orderByKey
使用orderByKey()
對數據進行排序時,按鍵升序返回數據。
- 具有可被解析為32位整數的鍵的子級首先出現,並以升序排序。
- 接下來是以字符串值作為鍵的子級,按字典順序升序排序。
orderByValue
使用orderByValue()
,子項按其值排序。排序標準與orderByChild()
相同,除了使用節點的值代替指定的子鍵的值之外。
分離聽眾
通過調用Firebase數據庫參考上的off()
方法可以刪除回調。
您可以通過將單個偵聽器作為參數傳遞給off()
來刪除它。在不帶參數的位置上調用off()
會刪除該位置上的所有偵聽器。
在父偵聽器上調用off()
不會自動刪除在其子節點上註冊的偵聽器。還必須在任何子偵聽器上調用off()
才能刪除回調。