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
相关产品推荐
相关产品推荐

