25
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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でオブサーブしないといけない」でハマったので今回まとめました。

25
12
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
25
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?