swift不检索firebase值(返回值为nsnull)(代码片段)

author author     2023-05-13     408

关键词:

我正在尝试从我的Firebase实时数据库中提取值,但无论出于何种原因,这些值都会以NSNull的形式返回。我收到错误'无法在第13行将'NSNull'类型的值转换为'NSNumber',直到我将'let count = ...'更改为'if let'。我不确定为什么这些值在它们不返回时返回null。

我已经尝试打印检索到的快照,并且,正如我所料,没有任何值为null。我很难过。这是打印检索到的快照时得到的日志:

[Snap (A12-1A) 0, Snap (B1-2A) 0, Snap (C2-3A) 0, Snap (D3-4A) 0, Snap (E4-5A) 0, Snap (F5-6A) 0, Snap (G6-7A) 0, Snap (H7-8A) 0, Snap (I8-9A) 0, Snap (J9-10A) 5, Snap (K10-11A) 0, Snap (L11-12P) 0, Snap (M12-1P) 0, Snap (N1-2P) 0, Snap (O2-3P) 0, Snap (P3-4P) 0, Snap (Q4-5P) 0, Snap (R5-6P) 0, Snap (S6-7P) 0, Snap (T7-8P) 0, Snap (U8-9P) 0, Snap (V9-10P) 0, Snap (W10-11P) 0, Snap (X11-12A) 0]

此快照中的所有数据都是我的Firebase数据库中的数据,因此我不确定为什么会出现此错误。

我的firebase设置:calendar-signups --- 04132019 ---(A12-1A:0,B1-2A:0,...,X11-12P:0)

func getCalendarSignupsOnDate(selectedDate: String, handler: @escaping (_ dateSignups: [Calendar]) -> ()) 
        var calendarArray = [Calendar]()

        REF_CALENDAR_SIGNUPS.observeSingleEvent(of: .value)  (snapshot) in
            guard let snapshot = snapshot.children.allObjects as? [DataSnapshot] else  return 

            var doesContainDate = false
            for date in snapshot 
                if date.key == selectedDate 
                    doesContainDate = true

                    self.REF_CALENDAR_SIGNUPS.child(date.key).observeSingleEvent(of: .value, with:  (dateSnapshot) in
                        guard let dateSnapshot = dateSnapshot.children.allObjects as? [DataSnapshot] else  return 

                        for timeSlots in dateSnapshot 
                            let time = timeSlots.key
                            if let count = timeSlots.childSnapshot(forPath: "J9-10A").value as? Int 
                                let calendarData = Calendar(time: time, signupCount: count)
                                calendarArray.append(calendarData)
                                handler(calendarArray)
                             else 
                                let count = 0
                                let calendarData = Calendar(time: time, signupCount: count)
                                calendarArray.append(calendarData)
                                handler(calendarArray)
                            
                        
                    )
                
            
            for item in calendarArray 
                print(item.time + " " + String(item.signupCount))
            
            if doesContainDate == false 
                let dateSignUpData = [
                    "A12-1A": 0,
                    "B1-2A": 0,
                    "C2-3A": 0,
                    "D3-4A": 0,
                    "E4-5A": 0,
                    "F5-6A": 0,
                    "G6-7A": 0,
                    "H7-8A": 0,
                    "I8-9A": 0,
                    "J9-10A": 0,
                    "K10-11A": 0,
                    "L11-12P": 0,
                    "M12-1P": 0,
                    "N1-2P": 0,
                    "O2-3P": 0,
                    "P3-4P": 0,
                    "Q4-5P": 0,
                    "R5-6P": 0,
                    "S6-7P": 0,
                    "T7-8P": 0,
                    "U8-9P": 0,
                    "V9-10P": 0,
                    "W10-11P": 0,
                    "X11-12A": 0
                    ]
                    as [String : Int]

                self.REF_CALENDAR_SIGNUPS.child(selectedDate).updateChildValues(dateSignUpData)

                for timeSlots in dateSignUpData 
                    let time = timeSlots.key
                    let count = timeSlots.value
                    let calendarData = Calendar(time: time, signupCount: count)
                    calendarArray.append(calendarData)
                
            

            handler(calendarArray)
        
    
答案

这不是一个完整的答案,但可能为您提供正确的方向。代码中有一些令人困惑的位,所以我会检查这些,然后可能提供更好的方向......

您的函数将在单个选定日期传递

func getCalendarSignupsOnDate(selectedDate: String

这意味着您知道您尝试阅读的日期节点。但是,代码正在读取所有日期并迭代它们试图找到该日期

 for date in snapshot 
   if date.key == selectedDate 

直接读取该节点可能要少得多的代码,然后使用其中的子节点。

此外,在代码中,您将迭代A12-1A,B1-2A的子节点,寻找特定节点

if let count = timeSlots.childSnapshot(forPath: "J9-10A").value as? Int

这根本不起作用,因为timeSlots A12-1A等有值,全0,而不是子快照。代码继续并显示您要读取该特定子节点的值,然后将其余值设置为0,这些值将添加到您的日历数组中。

let count = 0
let calendarData = Calendar(time: time, signupCount: count)

但是更进一步,如果你没有找到那个时间段,那么所有的子节点都被设置为0。

if doesContainDate == false 
    let dateSignUpData = [
       "A12-1A": 0,
       "B1-2A": 0,

所以...我想我得到了你想要做的事情的要点。这里有一些代码可以帮助您找到正确的方向。这应该替换您问题中的所有代码。

func getCalendarSignupsOnDate(selectedDate: String) 
    var dateSignUpData = [
        "A12-1A": 0,
        "B1-2A": 0,
        "C2-3A": 0,
        "J9-10A": 0
    ]
    let slotYourLookingFor = "J9-10A"
    let dateRef = self.REF_CALENDAR_SIGNUPS.child(selectedDate).child(slotYourLookingFor)
    dateRef.observeSingleEvent(of: .value, with:  snapshot in
        if snapshot.exists() 
            let count = snapshot.value as? Int ?? 0
            dateSignUpData[slotYourLookingFor] = count //update this array element with the new count from Firebaes
         else  //didn't find the child node at all, will create the date node and add child nodes with val = 0
            self.REF_CALENDAR_SIGNUPS.child(selectedDate).updateChildValues(dateSignUpData)
        
        //do something with the dateSignUpData array
    )

说明:

传递您感兴趣的日期。代码将读取具有子节点“J9-10A”的节点,您正在寻找的节点。

如果存在,它将读取该数据并使用该子节点的计数更新dateSignUpData数组。然后,您可以进一步处理更新的阵列。

如果“J9-10A”节点不存在,将创建一个传入日期的节点,然后将所有子节点插槽设置为0.然后,您可以进一步处理该数组。

最后一件事。将日期存储为yyyymmdd进行订购可能是一个好主意。

Firebase 在函数返回后检索数据

】Firebase在函数返回后检索数据【英文标题】:Firebaseretrievesdataafterthefunctionhavereturned【发布时间】:2016-10-0120:02:09【问题描述】:我是swift和firebase的新手,我需要一些帮助。我写了一个swift2函数,可以从firebase中检索数据,但是... 查看详情

Swift - 如何从 Firebase 检索多个值并将它们显示在 UITABLEVIEW

】Swift-如何从Firebase检索多个值并将它们显示在UITABLEVIEW【英文标题】:Swift-HowtoretrievemultiplevaluesfromFirebaseanddisplaythemonUITABLEVIEW【发布时间】:2017-08-1004:01:11【问题描述】:这是我的数据库的结构。我将每个事件都以uuid作为其唯... 查看详情

Swift方法中的Firebase“找不到成员:值”

】Swift方法中的Firebase“找不到成员:值”【英文标题】:Firebase"Couldnotfindmember:Value"inSwiftmethod【发布时间】:2015-08-2919:57:03【问题描述】:我有一段代码用于从Firebase检索一些信息。但是,我不知道为什么它不会识别它自... 查看详情

Firebase 检索数据 - Swift

】Firebase检索数据-Swift【英文标题】:FirebaseRetrievingData-Swift【发布时间】:2021-03-1723:41:54【问题描述】:我正在尝试从firebase获取数据,但由于某种原因它无法正常工作。我尝试了很多东西,但它们似乎仍然不起作用。我正在尝... 查看详情

swift alamofire 返回值为空

】swiftalamofire返回值为空【英文标题】:swiftalamofirereturnvalueisempty【发布时间】:2015-03-3120:21:21【问题描述】:您好,我有以下方法:funcgetAlamoPlayers()->[Player]//GetTeamIDletprefs:NSUserDefaults=NSUserDefaults.standardUserDefaults()varTeamId:Str 查看详情

Firebase,Swift:无法检索数据

】Firebase,Swift:无法检索数据【英文标题】:Firebase,Swift:NotabletoretrieveData【发布时间】:2016-09-0911:38:11【问题描述】:我正在尝试做一个简单的任务,从Firebase获取价值。我在下面的图像中添加了相关屏幕。至少有一个打印命令... 查看详情

从 Firebase Auto Id 中检索数据 - Firebase Swift

】从FirebaseAutoId中检索数据-FirebaseSwift【英文标题】:RetrievingDataFromFirebaseAutoId\'s-FirebaseSwift【发布时间】:2021-11-2810:07:44【问题描述】:我想在firebase中捕获childByAutoId中的所有值。本质上,它存储了一个人入围的所有项目。但是... 查看详情

Firebase 快照返回 null

】Firebase快照返回null【英文标题】:Firebasesnapshotreturnsnull【发布时间】:2017-08-0920:50:37【问题描述】:大家好,我一直在使用firebase从数据库中写入和读取值。在我编写了一个函数来检索通过以下方式使用swift存储的值或产品之... 查看详情

从 Firebase 检索数据等于意外 nil - swift

】从Firebase检索数据等于意外nil-swift【英文标题】:RetrievingdatafromFirebaseequalsunexpectednil-swift【发布时间】:2016-11-2413:59:04【问题描述】:我遇到了最奇怪的错误,我不知道如何解决它..我有一个Firebase数据库,其中包含所有来自用... 查看详情

从firebase实时数据库IOS Swift中检索数据

】从firebase实时数据库IOSSwift中检索数据【英文标题】:RetrievingdatafromfirebaserealtimedatabaseIOSSwift【发布时间】:2017-02-2011:34:14【问题描述】:我一直在尝试从firebase实时数据库中检索数据,但没有任何运气。我有一个4文本字段,您... 查看详情

Swift 检索 Firebase 数据

】Swift检索Firebase数据【英文标题】:SwiftRetreiveFirebasedata【发布时间】:2017-01-0405:27:38【问题描述】:Firebase数据库中的以下数据:"schedule":"Week1":"active":"true","Week2":"active":"true","Week3":"active":"false","Week4":"active":"true",...我想检索所... 查看详情

Swift 从 Firebase 检索数据

】Swift从Firebase检索数据【英文标题】:SwiftretrievedatafromFirebase【发布时间】:2017-08-1122:05:15【问题描述】:我已经尝试过从firebase(数据库)检索数据的不同尝试,但遗憾的是没有运气:我...所以我想知道这是否是正确的做法?l... 查看详情

Swift 从数据库中检索 Firebase 数据

】Swift从数据库中检索Firebase数据【英文标题】:SwiftRetrieveFirebaseDatafromDatabase【发布时间】:2017-07-2318:46:48【问题描述】:我正在尝试从Firebase检索数据,但遇到了问题。letrefEmployees=Database.database().reference(withPath:"Employees")refEmploye... 查看详情

在 Swift 中从 Firebase 检索数据的问题

】在Swift中从Firebase检索数据的问题【英文标题】:ProblemswithRetrievingDataFromFirebaseInSwift【发布时间】:2017-07-0200:17:15【问题描述】:我在Firebase中设置了一些数据对象,并尝试在Wwift中检索它们并将它们显示在表格视图中,但我无... 查看详情

函数没有返回,Swift Firebase

】函数没有返回,SwiftFirebase【英文标题】:Functionisn\'treturning,SwiftFirebase【发布时间】:2017-10-0605:35:03【问题描述】:我正在尝试使用下面显示的方法从firebase中提取数据并放入一个数组中。当使用建议的错误完成处理程序时,... 查看详情

从firebase检索到swift 3中的多个按钮

】从firebase检索到swift3中的多个按钮【英文标题】:Retrievefromfirebasetomultiplebuttonsinswift3【发布时间】:2017-03-1618:07:15【问题描述】:我正在尝试从firebase检索数据并显示到多个按钮和标签中。检索后,我将其保存到字典中。这是... 查看详情

Firebase 在 Swift 中检索低于自动 ID 的数据

】Firebase在Swift中检索低于自动ID的数据【英文标题】:FirebaseretrievedatabelowautoIDInSwift【发布时间】:2017-06-2202:46:46【问题描述】:我无法从Firebase检索数据。我想在autoID下读取JSON中的所有contactName数据,然后附加到UIPickerView。这... 查看详情

swift - Firebase 数据库快照检索。

】swift-Firebase数据库快照检索。【英文标题】:swift-Firebasedatabasesnapshotretrieval.【发布时间】:2017-04-0902:33:03【问题描述】:我有一个如下的数据库结构。下面的这个函数打印出子节点中的所有内容funcfetchUser()ref.child("Businesses").obs... 查看详情