質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.69%
Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

Cloud Firestore

Cloud Firestore は、自動スケーリングと高性能を実現し、アプリケーション開発を簡素化するように構築された NoSQLドキュメントデータベースです。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

1回答

1931閲覧

Firebase 重複のIDがなかったときにID登録できるようにしたい

progpen123

総合スコア3

Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

Cloud Firestore

Cloud Firestore は、自動スケーリングと高性能を実現し、アプリケーション開発を簡素化するように構築された NoSQLドキュメントデータベースです。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2020/10/07 14:04

編集2020/10/07 14:06

前提・実現したいこと

前提
TabBarController アプリメイン画面(ユーザ登録が終えていればいきたい先)

実現したいこと
アプリのユーザ登録をする場面で
ユーザがIDを入力した時、DB上に同じIDが入力あったときは弾いてくれて
同じIDがないときのみ登録ができるようなシステム

変数okが100のときにデータベースに書き込み、次のViewControllerまでいくようにした

該当のソースコード

swift

1import UIKit 2import Firebase 3import FirebaseFirestore 4 5class Auth2ViewController: UIViewController, UITextFieldDelegate { 6 let defaults = UserDefaults.standard 7 var db = Firestore.firestore() //インスタンスの取得 8 let user = Auth.auth().currentUser 9 var ok = 0 10 @IBOutlet weak var ID: UITextField! 11 @IBOutlet weak var Name: UITextField! 12 @IBOutlet weak var save: UIButton! 13 override func viewDidLoad() { 14 super.viewDidLoad() 15 ID.delegate = self //delegateプロパティにselfを設定 16 Name.delegate = self //delegateプロパティにselfを設定 17 } 18 @IBAction func save(_ sender: Any) { 19 view.endEditing(true) 20 if ID.text == "" 21 { 22 let alert = UIAlertController(title: nil, message: "IDが空欄です", preferredStyle: .alert) 23 alert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil)) 24 self.present(alert, animated: true, completion: nil) 25 } 26 else 27 { 28 db.collection("Users").whereField("ID", isEqualTo: ID.text!) 29 .getDocuments() { (querySnapshot, err) in 30 if let err = err {//同じ名前がなければ 31 self.ok = 100 //ここで条件が合う 32 } else { //同じ名前が見つかれば 33 for document in querySnapshot!.documents { 34 let alert = UIAlertController(title: nil, message: "このIDは使用されています", preferredStyle: .alert) 35 alert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil)) 36 self.present(alert, animated: true, completion: nil) 37 } 38 } 39 } 40 } 41 if ok == 100 42 {//user!.uidでUIDの取得 43 //DBへ登録 44 self.db.collection("Users").document(self.user!.uid).setData([ 45 "ID": self.ID.text!, 46 "name": self.Name.text! 47 ]) { err in 48 if let err = err 49 { 50 print("Error writing document: (err)") 51 }//登録できれば 52 print("Document successfully written!") 53 self.defaults.set(self.Name.text, forKey: "名前") 54 let nextVC = self.storyboard?.instantiateViewController(identifier: "TabBarController") 55 //フルスクリーンにする 56 nextVC!.modalPresentationStyle = .fullScreen 57 //シーン移動する 58 self.present(nextVC!, animated: true, completion: nil) 59 } 60 61 } 62 } 63 //キーボードの設定 64 func textFieldShouldReturn(_ textField: UITextField) -> Bool 65 { 66 view.endEditing(true) //キーボードを下げる 67 return false //改行をしない 68 } 69 70 @IBAction func tapView(_ sender: UITapGestureRecognizer) 71 { 72 view.endEditing(true) 73 } 74}

試したこと

あらかじめいくつかIDを登録しDB上で管理している状態で
アプリでの入力をDB上にあるIDにするとアラートがしっかりと表示された。
またTextfieldが空欄のときにもアラートは無事に表示された

DB上にないIDを入力した際にボタンを押したところ
画面遷移はもちろん,DB上にもデータが登録されなかった。

querySnapshotらへんのコードが不安なのですが
どういったエラーなのでしょうか?
よろしくお願いいたします。

補足情報(FW/ツールのバージョンなど)

xcode12

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

下記のような質問は推奨されていません。

  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

また依頼した内容が修正された場合は、修正依頼を取り消すようにしましょう。

guest

回答1

0

Swift

1db.collection("Users").whereField("ID", isEqualTo: ID.text!) 2 .getDocuments() { (querySnapshot, err) in 3 if let err = err {//同じ名前がなければ 4 self.ok = 100 //ここで条件が合う 5 }

whereFieldの条件で何も見つからなかった時は、エラーにはならず、
quertSnapshot.documents = []という結果が返ってきます。
なので、

Swift

1db.collection("Users").whereField("ID", isEqualTo: ID.text!) 2 .getDocuments() { (querySnapshot, err) in 3 if querySnapshot!.documents == []{//同じ名前がなければ 4 self.ok = 100 //ここで条件が合う 5 }else{ 6 ・・・

とすれば期待した結果が得られるかと思います。

投稿2021/04/07 04:13

hideto1198

総合スコア11

下記のような回答は推奨されていません。

  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

また依頼した内容が修正された場合は、修正依頼を取り消すようにしましょう。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.69%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

同じタグがついた質問を見る

Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

Cloud Firestore

Cloud Firestore は、自動スケーリングと高性能を実現し、アプリケーション開発を簡素化するように構築された NoSQLドキュメントデータベースです。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています