こんにちは、おーしまです。
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
・Firestore
(上の画像は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などは今回省略しましたので注意してください。
今回はここまでです。
それでは、また