現在、開発でfirebaseを使用しているのですが、どうしてもデータの構造になれなくて、つまづくことが多かったので、メモ。
例えば、下記のようなデータの構造があるとする。
この場合、「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を取得できたので、あとは配列に入れておしまい。
言葉にして説明しようとすると、うまく伝えられない。。。。