おーしまブログ

プログラミングやってます

【swift】Firestoreからの情報の保存、取得

こんにちは、おーしまです。

swiftを始めてまだ1ヶ月ですので、間違えていたらご指摘いただけると幸いです。

今回は、Firebaseのfirestoreから情報を保存、取得方法についてです。


保存方法

今回は、user情報をFirebaseのAuthenticationとFirestoreを駆使して保存していきます。


申し訳ありませんが、Firebaseのセットアップは各自でお願いします。

まずは、Authenticationです。
Authenticationを使用すると、ユーザーのログイン情報の管理を簡単に行ってくれるので便利です。
ログインプロバイダはEmailとPasswordにしました。

    private func createUserToFirestore() {
        guard let email = EmailTextField.text else { return }
        guard let password = PasswordTextField.text else { return }
        
        Auth.auth().createUser(withEmail: email, password: password) { (res, err) in
            if let err = err {
                print("manager認証情報の登録に失敗しました\(err)")
                return
            }
            print("manager認証情報の登録に成功しました")
    }

guard let でテキストフィールドの中身があることを確認し、Auth.auth().createUserでemail,passwordを登録しています。



続いて、firestoreにusersコレクションを作ります。

//上のprint("manager認証情報の登録に成功しました")の後ろに記述

//guard let で先ほどAuthenticationに保存したuidの中身をチェック
            guard let uid = res?.user.uid else { return }
            guard let userName = self.managerUserNameTextField.text else { return }
            
//辞書型で保存するため、[String: Any]でdocDataを作成
//どのように、どの値を入れるのか記述
            let docData = [
                "email": email,
                "userName": userName,
                "createdAt": Timestamp()
            ] as [String : Any]
            
//下の記述でFirestoreにデータを保存
            Firestore.firestore().collection("Users").document(uid).setData(docData) {(err) in
                if let err = err {
                    print("manager情報の保存に失敗しました\(err)")
                    return
                }
                print("manager情報の保存に成功しました")
            }
        }

上記のように記述することで、下の画像のように保存されます。
・Authentication
f:id:tomo_bb_aki0118115:20210119015651p:plain

・Firestore
f:id:tomo_bb_aki0118115:20210119015830p:plain
(上の画像はadminとprofileImageの情報がありますが、私個人が別の目的で保存したものですので無くて構いません)

また、AuthenticationのuserUIDとFirestoreのusersコレクションのDocumentIdが同じことがわかります。
これによって現在ログインしている人の情報を探しやすくします。




取得方法

    private func fetchLogInUserInfo() {

//最初に現在ログインしているユーザーのuidを取得
        guard let uid = Auth.auth().currentUser?.uid else { return }
        
//取得したuidでusersコレクションからユーザーの情報を取得
//userSnapshotにユーザーの情報が入り、errに取得できなかった際のエラー文が入る
        Firestore.firestore().collection("Users").document(uid).getDocument { (userSnapshot, err) in
            if let err = err {
                print("ユーザーの情報の取得に失敗しました\(err)")
                return
            }

//userSnapshotの中身があることを確認し、あらかじめ用意したUserクラスのインスタンスに代入
            guard let userSnapshot = userSnapshot, let dic = userSnapshot.data() else { return }
            let user = User(dic: dic)
            self.user = user
        }
    }

Userクラス

class User {
    
    let userName: String
    let email: String
    let createdAt: Timestamp
    
    init(dic: [String: Any]) {
        self.userName = dic["userName"] as? String ?? ""
        self.email = dic["email"] as? String ?? ""
        self.createdAt = dic["createdAt"] as? Timestamp ?? Timestamp()
    }
    
}

取得したデータは上のクラスのインスタンスに代入しています。
そうすることで、user.userNameなど取得した情報を扱いやすくしています。





import Firebaseなどは今回省略しましたので注意してください。





今回はここまでです。
それでは、また

ここはどこ おれはだれ それに近いものがあんだよ 始めようとした奴らも迷い始めてる 怖がらせないでよ そりゃ甘くはないけど まだまだ 夢見ていい世界なんでしょ {UVERwould「ハイ!問題作」}