LoginSignup
17
17

More than 5 years have passed since last update.

[ios]firebaseを使用したデータ取得について

Posted at

現在、開発でfirebaseを使用しているのですが、どうしてもデータの構造になれなくて、つまづくことが多かったので、メモ。
例えば、下記のようなデータの構造があるとする。
スクリーンショット 2017-12-14 1.22.58.png
この場合、「Group」以下を取り出すのは比較的簡単。

sample.swift
//この「ref」でこのツリー全体のrootを示す。
ref = Database.database().reference()
//refの下に「child()」で場所を示す。今回の場合は「Group」
ref.child("Gruop").observe(.value, with: { (snapshot) in
            中略・・・

私が今回、つまづいたのは「Group」の下にある一つブロックのその下にぶら下がっている(今回であれがusers)を取得する場合。

sample.swift
ref = Database.database().reference()
//refの下に「child()」で場所を示す。今回の場合は「Group」
ref.child("Gruop").observe(.value, with: { (snapshot) in

            for itemSnapShot in snapshot.children {
                //ここで取得したデータを自分で定義したデータ型に入れて、加工する
                let item = GroupData(snapshot: itemSnapShot as! DataSnapshot)
                                 ・・・中略

                }
            }

で、自分で定義したデータ型がこちら。
let dict にfirebaseで取得したデータを入れて、あとは取り出したい項目ごとにデータを加工。

GroupData.swift
class GroupData {

    var ref: DatabaseReference?
    var groupid: String?
    var name: String?
    var founder: String?
    var memberofnumber: Int?
    var payment: Int?
    var period: String?
    var message: String?
    var publicnum: Int?
    var groupprofile: String?
    var users : Array? = []

    init? (snapshot: DataSnapshot) {
        ref = snapshot.ref
        guard let dict = snapshot.value as? [String:Any] else { return nil }
        guard let groupid  = ref?.key  else { return nil }
        guard let name  = dict["name"] as? String  else { return nil }
        guard let founder = dict["founder"]  as? String else { return nil }
        guard let memberofnumber = dict["memberofnumber"]  as? Int else { return nil }
        guard let payment = dict["payment"]  as? Int else { return nil }
        guard let period = dict["period"]  as? String else { return nil }
        guard let message = dict["message"] as? String else { return nil }
        guard let publicnum = dict["publicnum"] as? Int else { return nil }
        guard let groupprofile = dict["groupprofile"] as? String else { return nil }
         guard let users = dict["users"] as? [String:AnyObject] else { return nil }
        var newusers : Array? = []

        for i in users.keys {
            newusers?.append(i)
        }

        self.name = name
        self.groupid = groupid
        self.founder = founder
        self.memberofnumber = memberofnumber
        self.payment = payment
        self.period = period
        self.message = message
        self.publicnum = publicnum
        self.groupprofile = groupprofile
        self.users = newusers


    }

}

自分は「users(ツリー上ののぶら下がっているブロック)」を配列として取得したかったので、配列として取得したところ、うまくいかず・・
データの型を [String:AnyObject]で宣言することで、keysで一つ一つのkeyを取得できたので、あとは配列に入れておしまい。
言葉にして説明しようとすると、うまく伝えられない。。。。

17
17
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
17
17