LoginSignup
26
13

More than 5 years have passed since last update.

Firebase Realtime Databaseのソート(order by)について swift4

Last updated at Posted at 2018-05-17

はじめに

RDBに慣れ親しんでいる人にとってFirebase Realtime Databaseは色々な所で詰まると思いますが、その一つがソート(order by)だと思います。

今回はシンプルなチャットAppを想定して下記データ形態とします。
スクリーンショット 2018-05-17 16.44.20.png

昇順(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で上記の昇順ソートをすると結果的に降順になる、という手法です。

スクリーンショット 2018-05-17 17.09.54.png

まとめ

個人的に「降順(DESC)でソート出来ない」「queryOrdered byChildはchildAddedでオブサーブしないといけない」でハマったので今回まとめました。

26
13
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
26
13