前提・実現したいこと
Firebase Realtime Databaseの初心者です。
Firebase Realtime Database からデータをフェッチしてUITableViewに表示したいと考えています。
発生している問題
次の三点を中心としたアドバイスをいただきたいです。
① 以下のコードで、写真のusers
から数えて2段目の階層のデータ(furigana
,name
)を取得できましたが、階層がもう一段下、3段目にあるデータ(applyDate
, bookingDate
)を取得するにはどうすれば良いのでしょうか。
② 私はuserIDを振っているので、user.idの子をリッスンしてデータを取得するためにDatabase.database().reference().child("users").child(user.id)
と表記しリッスンして①を試してみました。このuser.idのuserはAuth.auth().currentUser
を代入していますが、この.currentUser
は全てのユーザーを示しているのでしょうか。userIDは一意なので、user.idで参照することはできないと思い、この様に至りました。
③ user.idの子をリッスンしてデータを取得するには②の表記で良いのか、違う場合はどの様に表記すれば良いのかご教示お願いします。
該当の写真とコード
swift
1 refUserInfo = Database.database().reference().child("users") 2 refUserInfo.observe(.value) { [weak self](snapshot) -> Void in 3 if snapshot.exists() { 4 for userSnapshot in snapshot.children { 5 let userSnap = userSnapshot as! DataSnapshot 6 let dict = userSnap.value as! [String: AnyObject] 7 let name = dict["name"] as! String 8 let furigana = dict["furigana"] as! String 9 let applyDate = dict["applyDate"] as! Double] 10 //convertTimestampでapplyDateをDate型、そしてString型に変換 11 let applyDateString = convertTimestamp(timestamp: applyDate) 12 let bookingDate = dict["bookingDate"] as! String 13 //UserInfoClassはUITableViewCellに入れるデータのカスタムクラス 14 let info = UserInfoClass.init(name: name, furigana: furigana, bookDate: bookingDate, applyDate: applyDateString) 15 //userInfoはUserInfoClass型の配列 16 self?.userInfo.append(info) 17 self?.InfoTableView.reloadData() 18 } 19 }
自分で調べたことや試したこと
もう一段下げてfor文で取り出したらいけるのかと思い、試しましたが、予想通りうまくいきませんでした。
また、refUserInfo
でもう一段下げて(refUserInfo = Database.database().reference().child("users").(user.uid).child("applyDate")
(bookingDateも同様に))試しましたが途中でCould not cast value of type '__NSCFNumber' (0x1e437eae0) to 'NSDictionary'というエラーが出ました。以下のサイトを参考にしましたが、Database からのデータの取得についてはっきりと理解していない状態です。
https://stackoverflow.com/questions/56420640/swift-firebase-get-values-in-children
あなたの回答
tips
プレビュー