前提
タイトルにも書いたのですが、Firebaseに保存されているデータを取得して、アプリで確認したところ、保存されているデータの個数分、同じデータが取得されてしまいます。
例として、FirebaseFirestoreにドキュメントIDとしてAAA,BBB,CCC,DDDと保存されているとして、この4つのデータを取得しようと思ったところ、一番先頭のAAAのデータが4つ取得されてしまいます。
ドキュメントIDを指定すればそのデータは取れるのですが、やりたいこととしてまして、全件取得をしたいです。
ご教授お願いします。
ここに質問の内容を詳しく書いてください。
実現したいこと
上記で記載の通り、登録されているデータの全件取得を行いたいです。
発生している問題・エラーメッセージ
エラーメッセージではありませんが現象として、下記のキャプチャのようになってしまいます。
下記がFirebaseに登録されているデータですが、一番上のデータが3回取得されます。
該当のソースコード
// データ取得 import Foundation import Firebase import FirebaseFirestore class GetInfoViewModel: ObservableObject { @Published var things = [Thing]() init() { // Task { // try await fetchUser() // } fetchThings() } func fetchThings() { COLLECTION_THINGS.getDocuments { snapshot, _ in guard let documents = snapshot?.documents else { return } self.things = documents.map({Thing(thingsDictionary: $0.data())}) print("\(self.things)") } } }
// モデル import Foundation import Firebase class Thing: Identifiable { let id: String let imageURL: String //画像URL let thingsName: String //名称 let expirationDate: Timestamp //使用期限 let numberOfItems: Int //所持数 let place: String //保管場所 let classification: String //分類 let memo: String //メモ let userID: String //ユーザID(ログインしているユーザ) init(thingsDictionary: [String : Any]) { id = thingsDictionary["id"] as? String ?? "" imageURL = thingsDictionary["imageURL"] as? String ?? "" thingsName = thingsDictionary["thingsName"] as? String ?? "" expirationDate = thingsDictionary["expirationDate"] as? Timestamp ?? Timestamp(date: Date()) numberOfItems = thingsDictionary["numberOfItems"] as? Int ?? 0 place = thingsDictionary["place"] as? String ?? "" classification = thingsDictionary["classification"] as? String ?? "" memo = thingsDictionary["memo"] as? String ?? "" userID = thingsDictionary["userID"] as? String ?? "" } }
// 取得データの表示 import SwiftUI import Kingfisher struct MainView: View { @State private var isShowingAddThingsView = false @State private var isShowingSettingView = false @ObservedObject var getInfoVM = GetInfoViewModel() @EnvironmentObject var authVM: AuthViewModel var body: some View { if authVM.userSession != nil { NavigationView { ZStack{ List{ ForEach(getInfoVM.things){thing in Section(){ HStack{ KFImage(URL(string: thing.imageURL)) .resizable() .frame(width: 100, height: 100) NavigationLink(destination: DetailView(thing: thing)) { Text(thing.thingsName) Text("\(thing.expirationDate.dateValue(), formatter: dateFormat)") } } } } } .listStyle(PlainListStyle()) VStack{ Spacer() Button(action: {self.isShowingAddThingsView.toggle()}) { PlusButton() } AdmobBannerView() } .fullScreenCover(isPresented: $isShowingAddThingsView){ NavigationView{ AddThingsView(showingAddThingsView: $isShowingAddThingsView) } } } .navigationBarTitle("使用期限リスト", displayMode: .inline) .navigationBarBackButtonHidden(true) .toolbar { ToolbarItem(placement: .navigationBarLeading) { Button(action: { isShowingSettingView.toggle() }) { Text("設定") .foregroundColor(Color("BlueEyes")) } } } .fullScreenCover(isPresented: $isShowingSettingView) { SettingView(isShowingSettingView: $isShowingSettingView) } } } else { LoginView() } } } }
試したこと
Firebaseの公式リファレンスをメインに実装しました。

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/12/17 23:07
2022/12/25 22:25