チャットルームを取得する(DatabaseHelper)

公式ドキュメント

Cloud Firestore を使ってみる

 

作りたいデータベース

リファレンス

データベースの場所を指定

let db = Firestore.firestore()

 

データの取得 (コレクションにある複数のドキュメント)

基本的な取得方法

例「users」というコレクションに含まれる全てのドキュメントを取得

db.collection("users").getDocuments() { (querySnapshot, err) in
    //querySnapshot!.documentsでDocumentを配列形式で取得
}

クエリを使用して取得

例「users」というコレクションに含まれ、「age」が20であるドキュメントを取得

db.collection("users").whereField("age", isEqualTo: 20).getDocuments() { (querySnapshot, err) in
    //querySnapshot!.documentsでDocumentを配列形式で取得
}

データの取得 (特定のドキュメント)

コレクションとドキュメントIDを指定して、特定のドキュメントのみ取得することもできます。

db.collection("user").document(userID).getDocument() { (querySnapshot, error) in
    //querySnapshot!.dataで1つのDocumentを取得
}

struct(構造体)

データモデルの考え方と同じ

//構造体で保持したい値を指定
struct ChatRoom {
   let roomID:String
   let userID:String
}

//データを指定して構造体のインスタンスを作成
let data = ChatRoom(roomID:"XXXX", userID:"XXXX")

for文

「for 変数名 in 配列」と書くとその中のコードが配列の数だけ実行され、指定された変数名で配列の中身を取得できる。

1回目の実行では、変数に配列の1番目が代入され、
2回目の実行では、変数に配列の2番目が代入され…..

let companyList = ["google","amazon","facebook","apple"]
var count = 0
for company in copmanyList {
     print(\(count).company)
     count += 1
}

//結果 0.google 1.amazon 2.facebook 3.apple

完成したコード

import Foundation
import Firebase

class DatabaseHelper {
    
    let uid = AuthHelper().uid()
    let db = Firestore.firestore()
    
    func getMyRoomList(result:@escaping([ChatRoom]) -> Void){
        var roomList:[ChatRoom] = []
        db.collection("room").whereField("user", arrayContains: uid).addSnapshotListener({
            (querySnapshot, error) in
            if error == nil {
                for doc in querySnapshot!.documents {
                    let data = doc.data()
                    guard let users = data["user"] as? [String] else { return }
                    if users.count != 2 { return }
                    var user = ""
                    if users[0] == self.uid {
                        user = users[1]
                    } else {
                        user = users[0]
                    }
                    roomList.append(ChatRoom(roomID:doc.documentID, userID: user))
                }
                result(roomList)
            }
        })
    }
    
    func getUserInfo(userID:String,result:@escaping(String) -> Void){
        db.collection("user").document(userID).getDocument(completion: {
            (querySnapshot, error) in
            if error == nil {
                let data = querySnapshot?.data()
                guard let name = data!["name"] as! String? else {
                    result("")
                    return
                }
                result(name)
            } else {
                result("")
            }
        })
    }
}

struct ChatRoom {
    let roomID:String
    let userID:String
}

コメント

タイトルとURLをコピーしました