Firebaseを使用して質問のリストを表形式で表示するアプリケーションを構築しています。ユーザーが質問(テーブルビューのセル)をタップすると、その質問に関連付けられたAnswersのリストを表示する別のView Controllerに接続します。Firebase iOS Swift - チャットの会話IDに対応する子データを取得する
これは私が私のデータベースのJSONツリーを構造化しました方法です:
{
"answers": {
"question01": {
"answer01": {
"name": "kelly"
"text": "I'm doing great"
},
"answer02": {
"name": "george"
"text": "never been better"
}
}
},
"questions": {
"question01": {
"name": "courtney"
"text": "how are you?"
},
"question02": {
"name": "bob"
"text": "why is the earth round?"
}
}
私は最初のテーブルに質問を表示することができるよ次のコードでは問題を表示しない:
// MARK: - Firebase Database Configuration
func configureDatabase() {//this method gets called in viewDidLoad
ref = FIRDatabase.database().reference()
//listen for new questions in the database
_refHandle = self.ref.child("questions").observeEventType(.ChildAdded, withBlock: {(snapshot) -> Void in
self.questionsArray.append(snapshot)
self.tableView.insertRowsAtIndexPaths([NSIndexPath(forRow: self.questionsArray.count-1, inSection: 0)], withRowAnimation: .Automatic)
})
}
deinit {
self.ref.child("questions").removeObserverWithHandle(_refHandle)
}
// MARK: - UITableViewDataSource & UITableViewDelegate methods
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return questionsArray.count
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell: UITableViewCell! = self.tableView.dequeueReusableCellWithIdentifier("tableViewCell", forIndexPath: indexPath)
//unpack question from database
let questionSnapshot: FIRDataSnapshot! = self.questionsArray[indexPath.row]
let question = questionSnapshot.value as! Dictionary<String, String>
let name = question[Constants.QuestionFields.name] as String!
let text = question[Constants.QuestionFields.text] as String!
cell!.textLabel?.text = name + ": " + text
cell!.imageView?.image = UIImage(named: "ic_account_circle")
if let photoUrl = question[Constants.QuestionFields.photoUrl], url = NSURL(string:photoUrl), data = NSData(contentsOfURL: url) {
cell!.imageView?.image = UIImage(data: data)
}
return cell!
}
Firebase's guide to structuring dataに続いて、JSONツリー内の各子が共通に持つ会話IDを使用して質問に関連付けられたAnswersを取得する必要があると仮定しています。例: "question01"は、2つのAnswersを持つ最初のQuestionの会話IDです。
各質問に関連付けられた回答データを取得して、後でこれらの回答をテーブルビューで表示できるようにするにはどうすればよいですか?
私はテーブルビューにデータを表示する方法を質問するのではなく、質問の会話IDに関連付けられたFirebaseデータベースから回答データを取得するコードは何かを尋ねています。
一度にすべての回答をしたい、または一度に特定の質問に対応する回答をしますか? – triandicAnt
いくつかの事があります。 1)おそらくremoveObserverWithHandleは必要ありません。限られた数の質問があるようですので、* observeSingleEventOfType(.Value)*を使用してそれらを読み込み、スナップショットを繰り返してテーブルに追加することをお勧めします(新しい質問の通知を希望しない限り、 2)各質問にはキー:値のペアがあり、キーは質問の名前、つまり「question01」です。ユーザーがその質問をタップすると、answer/question01で* observeSingleEventOfType *とほぼ同じコードを使用して、answerViewに回答を入力します。 – Jay
@ triple.s回答は一度に特定の質問に対応したいと思います。たとえば、ユーザーが 'question01'をタップした場合、私は上記のJSONツリーを外しています:「あなたはどう?」アプリケーションは、 "私は偉大なやっている"と "決して良くなった"という2つの質問と回答を持つテーブルビューを表示する新しいビューコントローラに繋がるだろう – alexisSchreier