アプリ起動時にFireStoreからデータを取得する処理を実装したいのですが、AppDelegateやホーム画面で実装すると下記のエラーが発生します。
また、FireStoreにデータを保存する際にも、ちゃんとデータは用意されているのに必ず失敗します。
エラーメッセージのreasonを見ると、
「ドキュメントリファレンスがない」
のようですが、FireStore.firestore()を宣言しただけではダメなのでしょうか?
Databaseを使っていたので、FireStoreの扱いには不慣れで対処法がわかりません。
どうか、ご回答よろしくお願いします。
import UIKit
import Firebase
import FirebaseUI
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
override init() {
FirebaseApp.configure()
let db = Firestore.firestore()
//FireStore関連のメソッドがあるクラスのインスタンス
let readD = readData()
//ユーザーデータを取得
readD.readMyData() ←この行を通った時にエラーが発生
}
2019-02-18 15:20:41.449168+0900 BookShare[32939:1614032] - <AppMeasurement>[I-ACS036002] Analytics screen reporting is enabled.
Call +[FIRAnalytics setScreenName:setScreenClass:] to set the screen name or override the default screen class name.
To disable screen reporting, set the flag FirebaseScreenReportingEnabled to NO (boolean) in the Info.plist
2019-02-18 15:20:41.500977+0900 BookShare[32939:1613832] libMobileGestalt MobileGestalt.c:890:
MGIsDeviceOneOfType is not supported on this platform.
2019-02-18 15:20:43.673305+0900 BookShare[32939:1614032] 5.16.0 - [Firebase/Analytics][I-ACS023007]
Analytics v.50500000 started
2019-02-18 15:20:49.575354+0900 BookShare[32939:1614032] 5.16.0 - [Firebase/Analytics][I-ACS023008]
To enable debug logging set the following application argument: -FIRAnalyticsDebugEnabled (see http://goo.gl/RfcP7r)
2019-02-18 15:20:50.522672+0900 BookShare[32939:1613832] *** Terminating app due to uncaught exception 'FIRInvalidArgumentException',
reason: 'Invalid document reference.
Document references must have an even number of segments, but User has 1'
*** First throw call stack:
(
0 CoreFoundation 0x0000000111ad41bb __exceptionPreprocess + 331
1 libobjc.A.dylib 0x0000000111072735 objc_exception_throw + 48
2 BookShare 0x000000010dfe349c +[FIRDocumentReference(Internal) referenceWithPath:firestore:] + 476
3 BookShare 0x000000010dfdbb32 -[FIRCollectionReference documentWithPath:] + 450
4 BookShare 0x000000010de2c9a7 $S9BookShare8readDataC0c2MyD0yyF + 263
5 BookShare 0x000000010de459d7 $S9BookShare11AppDelegateCACycfc + 215
6 BookShare 0x000000010de45a63 $S9BookShare11AppDelegateCACycfcTo + 19
7 UIKitCore 0x00000001161fae5f _UIApplicationMainPreparations + 1526
8 UIKitCore 0x00000001161fa7ed UIApplicationMain + 92
9 BookShare 0x000000010de47097 main + 71
10 libdyld.dylib 0x000000011379e575 start + 1
)
//FireStoreに保存
for i in 0...4 {
db.collection("Item").document(randomCharacters).setData(items[i], completion: { (err) in
//[[String:String]]型の変数から[String:String]型の要素を1つずつ保存
print(self.items[i])
if err != nil {
print("success")
} else {
print("fail")
}
})
}
["DeliveryBurden": "着払い(受取人)", "UserID": "",
"Title": ";‘\l", "DeliveryDay": "7~8日",
"Good": "0", "UserName": "", "Date": "2019/02/18 15:25:34",
"DeliveryWay": "ゆうパック", "State": "ボロボロ",
"ItemID": "O9uerVzq8", "Category": "科学", "Status": "display"]
fail
["?": "?"]
fail
["?": "?"]
fail
["?": "?"]
fail
["?": "?"]
fail
※追記
これのことでしょうか? 今の所心当たりがありません。
以下がデータを読み込む関数ですが、階層の指定に問題があるのでしょうか?
func readMyData() {
//データ取得開始
db.collection("User").document(userDataClass.userID).getDocument() { (snapdata, err) in
//エラー処理
if let err = err {
print("Error getting documents: \(err)")
} else {
//データを順に取り出していく
for key in snapdata!.data()!.keys.sorted() {
//該当する値を対応する値に代入していく
switch key {
case "UserName":
self.userDataClass.userName = snapdata![key]! as! String
case "UserID":
self.userDataClass.userID = snapdata![key]! as! String
case "Follow":
self.userDataClass.follow = snapdata![key]! as! String
case "Follower":
self.userDataClass.follower = snapdata![key]! as! String
case "Good":
self.userDataClass.good = snapdata![key]! as! String
case "Share":
self.userDataClass.share = snapdata![key]! as! String
case "Get":
self.userDataClass.get = snapdata![key]! as! String
case "Profile":
self.userDataClass.profile = snapdata![key]! as! String
default:
break
}
}
}
}
}
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
0
'Invalid document reference.
Document references must have an even number of segments, but User has 1'
偶数じゃないとダメなのに1になってる的なことを指摘されていますが心当たりは無いでしょうか。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
db.collection("User").document(userDataClass.userID).getDocument()
↓
db.collection("User").getDocument()
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.34%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2019/02/18 17:12
firebase知らないので私には分からないけど。
エラーメッセージをちゃんと読もうよ、って趣旨の回答です。
2019/02/18 17:35
を
db.collection("User").getDocument()
に書き換えたらうまく行きました。
データ読み込みの構成自体が間違っていたようです。
2019/02/18 17:43