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

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

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

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

Cloud Firestore

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

Swift

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

Q&A

0回答

1983閲覧

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

key.M

総合スコア0

Firebase

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

Cloud Firestore

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

Swift

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

0グッド

0クリップ

投稿2020/07/18 16:24

編集2022/01/12 10:55

プログラミング初心者です。
現在、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()との関係で何かあるのかもしれません
完全に解決したいので、どなたか分かる方いらっしゃったら教えてください

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TsukubaDepot

2020/07/18 21:45

Firebaseは扱ったことがないのであくまでもエラーメッセージからの推測ですが、 > Document references must have an even number of segments, but Room has 1 となっていますので、偶数を渡すべきところで1を渡しているような箇所で落ちているのではないでしょうか。
TsukubaDepot

2020/07/18 21:46

あと、ソースコードは ``` で囲むか、マークダウン機能を使って入力いただいた方が、ソースコードが整形されるため解決も早くなるかもしれません。
key.M

2020/07/19 05:41

すいません! ソースコード修正しました! ネットで調べると同じようなことが言われていたのですが、どこを偶数で渡すのかが書かれておらず Firestore.firestore().collection("Room").document(roomname).getDocument{}を Firestore.firestore().collection("Room).getDocument{}としたらうまくいったと書かれていました 偶数で渡すとは、引数の数を偶数にするということでしょうか? それともドットの数を偶数にするということでしょうか?
TsukubaDepot

2020/07/19 05:48

私はFirebase は使ったことがないですし、ドキュメント構造もわからないのでなんとも言えないのですが、 「Room has 1」という結果が、「Document references must have an even number of segments, 」に対して出ているので、この辺りを参考に構造を調べ直していただく必要がありそうな気がします。 また、今回のご質問は「swiftで画面遷移ができない」とありますが、エラーメッセージから推測するに  Firebase 由来のトラブルだとおもいますので、ご質問のタイトルやタグも変更していただいた方がいいかと思います(Firebaseに詳しい人が見逃す可能性が高いかと思います)。
key.M

2020/07/19 06:01

わかりました! ドキュメントの階層構造について自分でもう一度調べてみます! ありがとうございます!
TsukubaDepot

2020/07/19 06:35

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

2020/07/19 06:36

たぶん直接は関係ありませんが、 ffcd.getDocument{(snapshot,err) in if let err = err { self.label.text = "部屋が存在しません❶" } という処理で、Error が発生していてもラベルを表示したあとそのまま処理を続行しているようですが、これは正しい処理なのでしょうか。
key.M

2020/07/19 07:12

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問