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

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

ただいまの
回答率

88.81%

Invalid document reference. Document references must have an even number of segmentsというエラーについて

受付中

回答 0

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 279

key.M

score 0

プログラミング初心者です。
現在、firestoreを用いてNumer0nというゲームを作っています。
今回、ユーザーのIDをRoomコレクションの中のroomname(変数)というドキュメントに保存して次の画面に移動したいのですが、アプリがクラッシュしてしまいます。
エラーメッセージで検索をかけるといくつか記事が出てくるのですが、firestore自体に値は保存されており、調べていくとどうやら画面遷移のタイミングでエラーが出てくるみたいです。
そこでif文等使ってコードを分けてみたのですがうまくいきませんでした。
他の非同期処理のコードは同じようにやってうまくいくので、何が原因なのかさえも分からなくなってしまいました。
どなたか教えてください。

前提・実現したいこと

ここに質問の内容を詳しく書いてください。

IDをドキュメントに保存したのちに画面遷移

エラーメッセージ

Thread 1: Exception: "FIRESTORE INTERNAL ASSERTION FAILED: Invalid document reference. Document references must have an even number of segments, but Room has 1"
### 該当のソースコード

@IBAction func decision(_ sender: UIButton) {

        if opt {
            let storyboard = UIStoryboard(name: "waitingRoomStoryboard", bundle: nil)
            let waitingViewController = storyboard.instantiateViewController(identifier: "waitingViewController")
            self.present(waitingViewController,animated: true,completion: nil)
//        画面遷移
        }else{
            let defaltstore = Firestore.firestore()
            guard var roomname = roomnameText.text else { return }
            guard var password = passwordText.text else { return }

            let ffcd = defaltstore.collection("Room").document(roomname)

//         firestoreのインスタンス作成

            ffcd.getDocument{(snapshot,err) in if let err = err {
                        self.label.text = "部屋が存在しません❶"
                        }

                guard let date = snapshot?.data() else {
                            self.label.text = "部屋が存在しません❷" 
                            return
                        }

                guard let roomPass = date["パスワード"] else {return}

                print(roomPass)   //→.collection("Room")を省くと出力されない?

                if roomPass as? String == password{

                    guard let useruid = loginViewController.self.user?.uid else {return}

                    print(useruid)

                    ffcd.updateData(["メンバーID2": useruid])

                    self.label.text = "入室できました。"

                    self.opt = true  
                }else{
                        self.label.text = "パスワードが違います"
                }

            }

        }

    }
swift

試したこと

エラーコードの検索
firestoreのインスタンスを変える
optという変数を用いて、処理を分岐させる

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

補足になるのかわかりませんが、一度if optのelseの中身を全てコメントにし、ボタンを二回押したら画面遷移が起きるようにしてみたのですが、やはり画面遷移でアプリがクラッシュしてしまい、エラーコメントは同じでした
これは他のviewcontrollerに問題があるのでしょうか?
それともfirestoreのアクセス権的なのに問題があるのでしょうか?
はたまた画面遷移のコードに何か問題があるのでしょうか?

追記 7/19 16:48 
遷移先を別の画面にしたらコードが通りました
もしかしたら、遷移先のviewdidload()の中にあったsunapshotlisner()との関係で何かあるのかもしれません
完全に解決したいので、どなたか分かる方いらっしゃったら教えてください

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正の依頼

  • TsukubaDepot

    2020/07/19 15:35

    お役に立てませんでしたが、解決されることを祈っています。

    キャンセル

  • TsukubaDepot

    2020/07/19 15:36

    たぶん直接は関係ありませんが、

    ffcd.getDocument{(snapshot,err) in if let err = err {
    self.label.text = "部屋が存在しません❶"
    }

    という処理で、Error が発生していてもラベルを表示したあとそのまま処理を続行しているようですが、これは正しい処理なのでしょうか。

    キャンセル

  • key.M

    2020/07/19 16:12

    returnが抜けてました
    追加しておきます!

    キャンセル

まだ回答がついていません

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

  • ただいまの回答率 88.81%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

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