使用 Apple 平台上的資料清單

取得 FIRDatabaseReference

如要從資料庫讀取或寫入資料,您需要使用 FIRDatabaseReference:

Swift

注意:這項 Firebase 產品不適用於 App Clip 目標。
var ref: DatabaseReference!

ref = Database.database().reference()

Objective-C

注意:這項 Firebase 產品不適用於 App Clip 目標。
@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

注意:這項 Firebase 產品不適用於 App Clip 目標。
// 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

注意:這項 Firebase 產品不適用於 App Clip 目標。
// 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

注意:這項 Firebase 產品不適用於 App Clip 目標。
_commentsRef.observe(.value) { snapshot in
  for child in snapshot.children {
    ...
  }
}

Objective-C

注意:這項 Firebase 產品不適用於 App Clip 目標。
[_commentsRef
              observeEventType:FIRDataEventTypeValue
              withBlock:^(FIRDataSnapshot *snapshot) {
                // Loop over children
                NSEnumerator *children = [snapshot children];
                FIRDataSnapshot *child;
                while (child = [children nextObject]) {
                  // ...
                }
              }];

當您想要擷取清單的所有子項時,這種模式相當實用 視為單一作業,而非監聽額外新增的子項 事件。

排序及篩選資料

您可以使用即時資料庫 FIRDatabaseQuery 類別來擷取排序的資料 或子項的值你也可以篩選 在特定數量的結果或索引鍵範圍內排序的結果 輕鬆分配獎金

排序資料

如要擷取經過排序的資料,請先指定其中一種排序方法,以便 決定結果的排序方式:

方法 用量
queryOrderedByKey 按子項鍵排序結果。
queryOrderedByValue 按照子項值排序結果。
queryOrderedByChild 按指定子項鍵或巢狀子路徑的值排序結果。

一次只能使用「一個」排序方法。依訂單呼叫方法 重複計算錯誤。

以下範例說明如何擷取使用者的 熱門訊息會按照星級評等排序:

Swift

注意:這項 Firebase 產品不適用於 App Clip 目標。
// My top posts by number of stars
let myTopPostsQuery = ref.child("user-posts").child(getUid()).queryOrdered(byChild: "starCount")

Objective-C

注意:這項 Firebase 產品不適用於 App Clip 目標。
// 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

注意:這項 Firebase 產品不適用於 App Clip 目標。
 
let postsByMostPopular = ref.child("posts").queryOrdered(byChild: "metrics/views")

Objective-C

注意:這項 Firebase 產品不適用於 App Clip 目標。
 
FIRDatabaseQuery *postsByMostPopular = [[ref child:@"posts"] queryOrderedByChild:@"metrics/views"];

如要進一步瞭解其他資料類型的排序方式, 請參閱查詢資料的排序方式

篩選資料

如要篩選資料,可以使用任何限製或範圍方法, 依順序排序查詢。

方法 用量
queryLimitedToFirst 設定從 結果的排序清單。
queryLimitedToLast 設定從訂單結尾傳回的項目數量上限 結果清單。
queryStartingAtValue 傳回大於或等於指定鍵/值的項目。 視所選的訂單而定
queryStartingAfterValue 傳回大於指定鍵或值的項目, 視所選的訂單而定
queryEndingAtValue 傳回小於或等於指定鍵/值的項目; 視所選的訂單而定
queryEndingBeforeValue 傳回小於指定鍵或值的項目; 視所選的訂單而定
queryEqualToValue 根據 。

有別於逐一排序的方法,您可以合併多個限製或範圍函式。 例如,您可以結合 queryStartingAtValuequeryEndingAtValue 方法 將結果傳回指定範圍內的值

限制結果數量

您可以使用 queryLimitedToFirstqueryLimitedToLast 方法設定 要為特定回呼同步處理的子項數量上限。舉例來說 您使用 queryLimitedToFirst 將限制設為 100,一開始只會接收 至 100 個 FIRDataEventTypeChildAdded 回呼。如果您儲存的項目少於 100 個 Firebase 資料庫,每個項目都會觸發 FIRDataEventTypeChildAdded 回呼。

當項目變更時,系統會針對輸入值的項目接收 FIRDataEventTypeChildAdded 回呼 以及 FIRDataEventTypeChildRemoved 回呼, 總數會維持在 100

以下範例示範網誌應用程式如何擷取 所有使用者最新發布的 100 篇清單:

Swift

注意:這項 Firebase 產品不適用於 App Clip 目標。
// 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

注意:這項 Firebase 產品不適用於 App Clip 目標。
// Last 100 posts, these are automatically the 100 most recent
// due to sorting by push() keys
FIRDatabaseQuery *recentPostsQuery = [[self.ref child:@"posts"] queryLimitedToFirst:100];

依鍵或值篩選

您可以使用 queryStartingAtValuequeryStartingAfterValuequeryEndingAtValuequeryEndingBeforeValuequeryEqualToValue 可選擇任意的起始、結束和等價點,以便執行查詢作業。這個 很適合用於將資料分頁或找出具有子項 特定值。

查詢資料的排序方式

本節會說明 FIRDatabaseQuery 類別。

queryOrderedByKey

使用 queryOrderedByKey 排序資料時,系統會以遞增順序傳回資料 。

  1. 如果子項的索引鍵可剖析為 32 位元整數,其內容會先以遞增順序排序。
  2. 具有字串值做為索引鍵的下一個子項,並依字母順序遞增排序。

queryOrderedByValue

使用 queryOrderedByValue 時,子項會按照值的順序排列。順序 條件與 queryOrderedByChild 相同,但節點值 ,而不是指定子鍵的值。

queryOrderedByChild

使用 queryOrderedByChild 時,包含指定子項鍵的資料將會是 排序如下:

  1. 針對指定子項鍵有 nil 值的子項,如下所示 首先。
  2. 指定子鍵值為 false 的子項 取得下一個提示如果多個子項的值為 false,這些子項就會 依鍵字母順序排序。
  3. 指定子鍵值為 true 的子項 取得下一個提示如果多個子項的值為 true,這些子項就會 依索引鍵字母順序排列
  4. 含有數值的子項接著會以遞增順序排序。如果 多個子項的數值相同 節點,按鍵排序。
  5. 字串是由數字後方,並依字母順序遞增 順序。如果多個子項具有相同的值 節點的節點,按照鍵的字母順序排列。
  6. 物件在最後,且依索引鍵順序排列,以遞增順序排列。

卸離事件監聽器

您離開 ViewController。如果未正確移除觀測器,該觀察器會繼續同步處理 資料傳到本機記憶體,並會保留事件處理常式所擷取的任何物件 關閉可能會導致記憶體流失。不再需要觀察器時 方法是將相關聯的 FIRDatabaseHandle 傳遞至 removeObserverWithHandle 方法。

在參照中新增回呼區塊時,系統會傳回 FIRDatabaseHandle。 這些控點可用於移除回呼區塊。

如果已在資料庫參照中新增多個事件監聽器,則每個事件監聽器都會 則會在引發事件時呼叫。如要停止同步處理該位置的資料, 您必須呼叫 removeAllObservers 來移除位置中的所有觀察器 方法。

在事件監聽器上呼叫 removeObserverWithHandleremoveAllObservers 會 不會自動移除在子節點上註冊的事件監聽器;你還需要 追蹤這些參考檔案或帳號代碼,以便予以移除

後續步驟