You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift中Firebase实时数据库数据获取失败问题求助

问题:Firebase实时数据库数据在App中无法显示(控制台可见)

我尝试从Firebase实时数据库获取数据,控制台里能看到数据,但App里就是显示不出来。数据库结构如下:
users -> someUserIDs -> items -> someItemIDs -> detailsOfTheItem

使用UserDefaults时功能正常,切换到实时数据库后就无法正常显示数据。


数据库结构

users -> [用户ID] -> items -> [物品ID] -> {物品详情字段}

DatabaseManager类代码

static var shared = DatabaseManager()

private let databaseRef = Database.database().reference()

func saveItem(_ item: InventoryItem, path: String) {
    let itemRef = databaseRef.child(path).child(item.id)
    itemRef.setValue(item.dictionaryRepresentation())
}

func fetchItems(path: String, completion: @escaping ([InventoryItem]) -> ()) {
    let itemsRef = databaseRef.child(path)
    
    itemsRef.observeSingleEvent(of: .value, with: { (snapshot) in
        guard let value = snapshot.value as? [String: Any] else {
            print("No items data found")
            completion([])
            return
        }
    
        var items = [InventoryItem]()
        for (_, itemData) in value {
            guard let itemDict = itemData as? [String: Any],
                  let itemID = itemDict["itemID"] as? String,
                  let name = itemDict["name"] as? String,
                  let itemPrice = itemDict["itemPrice"] as? Double,
                  let itemQuantity = itemDict["itemQuantity"] as? Int,
                  let size = itemDict["size"] as? String,
                  let AdditionDateTimestamp = itemDict["AdditionDate"] as? Double,
                  let itemNotes = itemDict["itemNotes"] as? String

            else {
                continue
            }

            let AdditionDate = Date(timeIntervalSince1970: AdditionDateTimestamp)
        
            let item = InventoryItem(
                 itemID: itemID,
                 name: name,
                 itemPrice: itemPrice,
                 itemQuantity: itemQuantity,
                 size: size,
                 AdditionDate: AdditionDate,
                 itemNotes: itemNotes
            )
        
            items.append(item)
        }
        
        completion(items)
    })
}

InventoryManager类代码

class InventoryManager: ObservableObject {
    
    static var shared = InventoryManager()
    @Published var items: [InventoryItem] = []
    private var isUserSignedIn = Auth.auth().currentUser != nil

    func fetchItemsFromDB() {
        if let currentUser = Auth.auth().currentUser {
            let userID = currentUser.uid
            print("Current UserID: \(userID)")
            let path = "users/\(userID)/items"

            DatabaseManager.shared.fetchItems(path: path, completion: { fetchedItems in
                self.items = fetchedItems
            })
        }
    }

    func saveItem2DB(_ item: InventoryItem) {
        if let currentUser = Auth.auth().currentUser {
           let userID = currentUser.uid
           let path = "users/\(userID)/items"
           DatabaseManager.shared.saveItem(item, path: path)
        }
    }

    func addItem(item: InventoryItem) {
        items.append(item)
        if isUserSignedIn{
            saveItem2DB(item)
        }
        else{
            saveItems2UD()
        }
    }
}

ContentView代码

struct ContentView: View {
    @StateObject private var inventoryManager = InventoryManager.shared
    @State private var isUserSignedIn = Auth.auth().currentUser != nil
    init() {
        if isUserSignedIn {
            InventoryManager.shared.fetchItemsFromDB()
        }
        else {
            InventoryManager.shared.loadItemsFromUD()
        }
    }
...
}

InventoryContentView代码

struct InventoryContentView: View {
    
    @ObservedObject var inventoryManager: InventoryManager
    ...
    var filteredItems: [InventoryItem] {
        if searchText.isEmpty {
            return Array(inventoryManager.getItems())
        } else {
            return Array(inventoryManager.getItems().filter { $0.name.lowercased().contains(searchText.lowercased()) })
        }
    }
    

    var body: some View {
    ...
     if inventoryItems.isEmpty {
                        Text("No inventory items yet")
                            .font(.headline)
                            .frame(maxWidth: .infinity, maxHeight: .infinity)
                    }
                    else
                    {
                        List(sortedItems) { item in  // sortedItems gets its data from filteredItems
                            
                            NavigationLink(destination: ItemDetailsView(inventoryManager: inventoryManager, item: item))
                            {
                                VStack(alignment: .leading) {

                                    Text("Name: \(item.name)")
                                    Text("Price: \(item.itemPrice, specifier: "%.2f")")
                                    Text("Q: \(item.itemQuantity)")
                                }
                            }
         ...
        }
   var inventoryItems: [InventoryItem] {
        return inventoryManager.items
    }
    
}

内容的提问来源于stack exchange,提问作者Shir Uni

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 21:29:54