【问题标题】:Split Firebase key-value pairs into seperate arrays将 Firebase 键值对拆分为单独的数组
【发布时间】:2019-08-28 18:52:36
【问题描述】:

我正在开发一个星级评分系统,用户可以在该评分系统中对某个项目进行 1 到 5 星评分,并查看所有用户的平均星级评分。

到目前为止,我已经能够将用户评分发送到我的 firebase 数据库,其中键值对由用户 ID 和他们作为 Double 的给定评分组成。我还可以检索所述数据并将其打印到控制台,但问题是我只需要在新数组中加倍评分即可计算平均评分;不是它附带的用户 ID 字符串。

如何将用户 ID 字符串和给定 Double 的评分分开,以便我只能使用评分数字?

我尝试创建一个新的空数组,并将 Firebase 中的分数 Double 附加到其中,但似乎没有任何效果,我不知道为什么。

使用以下代码,我可以打印出项目的键值对 (sentData1)

        handle = ref.child(sentData1).observe(.value, with: { (snapshot) in

        print(snapshot)

    })

更新:我设法使用这段代码得到了我想要的东西:

ref.observe(.value) { (snapshot) in
        if let data = snapshot.value as? [String: Any] {
            let values = Array(data.values)

            print(values)
        }
    }

但是,我现在遇到了一个奇怪的问题:当第一次启动应用程序并对不同的项目进行评分时,它可以完美地以数组格式 [2, 5, 3, 4] 显示项目获得的所有评分。但是,当我继续对更多项目进行评分时,它会随机开始给我两次数组,然后是三次,以此类推:

[4, 2, 3, 4]

[4, 2, 3, 4] [4, 2, 3, 4]

一段时间后它最终崩溃并给我错误消息

"Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value"

在将数据写入 Firebase 数据库的代码行中:

userDB.child(sentData2).child(UserID!).setValue(cosmosRating!)

【问题讨论】:

    标签: ios swift firebase firebase-realtime-database


    【解决方案1】:
    let dict = ["userId1" : 2.4, "userId2" : 2.0, "userId3": 4.5]
    

    你可以这样做

    let array = Array(dict.values)
    print(array)
    
    // Prints [2.0, 2.4, 4.5]
    

    【讨论】:

    • 那将是一个很好的解决方案,是的。但是我的问题是我无法将用户 ID 和 Double 值划分为单独的数据组,因此我无法将它们添加到字典中。我能够访问用户 ID 和 Double 的唯一方法是使用快照,但是这个关键字给了我两个值。
    【解决方案2】:

    编辑:

    我尚未对其进行测试,希望它对您有所帮助,但它看起来像这样。 我会先创建一个用户对象

    class User: NSObject {
    
       public var userID: String!
       public var rating: Double!
    
       // default constructor
       convenience override init() {
           self.init(userID: " ", rating: 0.0)
       }
    
        // copy constructor
        init(userID: String, rating: Double) {
            self.userID = userID
            self.rating = rating
        }
    }
    

    然后初始化一个对象数组

    var userArray = [User]()
    

    并从 firebase 获取所有用户数据

    ref.observe(DataEventType.value, with: {(snapshot) in
        for user in snapshot.children.allObjects as! [DataSnapshot]{
            for userChild in user.children.allObjects as! [DataSnapshot]{
                let tempUser = userChild.value as! [String:AnyObject]
                let id= tempUser["USER_ID"] as! String
                let star = tempUser["RATING"] as! Double
    
                let x = userArray(userID: id, rating: star)
                print("user id: \(x.userID) \n star rating: \(x.rating)")
                 self.userArray.append(x)
    
            }
        }
    })
    

    希望对你有帮助

    【讨论】:

    • 感谢您的评论。这段代码给了我一个错误:“Cannot call value of non-function type '[User]'” at let x = userArray(userID: id, rating: Double(star))
    • 某处有错别字
    猜你喜欢
    • 2022-01-14
    • 1970-01-01
    • 1970-01-01
    • 2013-08-29
    • 1970-01-01
    • 2011-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多