#はじめに
RDBに慣れ親しんでいる人にとってFirebase Realtime Databaseは色々な所で詰まると思いますが、その一つがソート(order by)だと思います。
今回はシンプルなチャットAppを想定して下記データ形態とします。
#昇順(ASC)でソート(order by)する方法
messageModel.swift
Database.database().reference().ref.child("messages").child("groupID1")
.queryOrdered(byChild: "created")
.observe(.childAdded , with: { snapshot in
guard let commentsDict = snapshot.value as? [String: Any] else { return }
let sender = commentsDict["sender"] as? String
let message = commentsDict["message"] as? String
let created = commentsDict["created"] as? Int
// data,Messageというオブジェクトを別で定義していますが、今回その部分は割愛します
self.data?.append(Message(sender: sender!, message: message!, created: created!))
})
・.queryOrdered(byChild: "created")
でcreatedを指定します。
・observe
の第一引数は .childAdded
です。(ここが .value
だとソートされません)
#降順(DESC)でソート(order by)する方法
実はFirebase側で降順ソートするAPIが存在しません。
その為、少し工夫が必要になります。
messageに「orderCnt」というKeyを作ってInsert時にマイナスに増やします。
そのKeyで上記の昇順ソートをすると結果的に降順になる、という手法です。
#まとめ
個人的に「降順(DESC)でソート出来ない」「queryOrdered byChildはchildAddedでオブサーブしないといけない」でハマったので今回まとめました。