gpt4 book ai didi

ios - 使用 Swift 在 Firebase 中添加值而不是更改值

转载 作者:行者123 更新时间:2023-11-29 01:08:20 25 4
gpt4 key购买 nike

我想将 Firebase 的功能保存到 TableView 或从中检索功能。我想将它们保存在 child 下的是 uid(唯一用户 ID)

所以一个特征在数据库中看起来像这样:

Firebase database

理想情况下,“derde”是如何保存的,所以 uid 作为键,“derde”作为值。

@IBAction func saveButtonPressed(sender: AnyObject) {

let featureContents = addFeatureTextField.text

if featureContents != "" {

// Build the new Feature.


let newFeature: String = featureContents!

let ref = DataService.dataService.FEATURE_REF.childByAppendingPath(uid)
ref.setValue(newFeature)

其中 uid 是一个字符串,从代码中其他地方的 authdata 检索。

如果我这样保存,它会保存到特定的uid路径。如果我想通过单击 TableViewController 中的 + 添加另一个功能,它会将其保存到相同的路径,因此 Firebase 数据库会使用新值进行更新,因此您最终只会得到一个更新的功能,而不是两个功能。

您可以通过使用 chilByAutoId() 方法来保存项目列表来防止这种情况。代码如下所示:

   @IBAction func saveButtonPressed(sender: AnyObject) {

let featureContents = addFeatureTextField.text

if featureContents != "" {

// Build the new Feature.


let newFeature: String = featureContents!

let ref = DataService.dataService.FEATURE_REF.childByAutoId().childByAppendingPath(uid)
ref.setValue(newFeature)

通过这种方式,保存了一个特征,如上图所示:“vierde”这允许您使用相同的 uid 但不同的 autoId 保存多个特征。

但是,如果我这样保存它,我的 tableView 将保持为空。 TableViewController 是这样的:

DataService.dataService.FEATURE_REF.observeEventType(.Value, withBlock: { snapshot in

// The snapshot is a current look at our features data.

print("The features in the tableView should be \(snapshot.value)")

self.features = []

if let snapshots = snapshot.children.allObjects as? [FDataSnapshot] {



for snap in snapshots {

// Make our features array for the tableView.



if let postDictionary = snap.value as? String {



print("All in")


let key = snap.key

let feature = Feature(key: key, value: postDictionary)

// Items are returned chronologically, but it's more fun with the newest features first.

self.features.insert(feature, atIndex: 0)
}
}

}

// Be sure that the tableView updates when there is new data.

self.tableView.reloadData()
})



}

问题出在这段代码中:if let postDictionary = snap.value as?字符串 {

这个条件绑定(bind)没有成功,因为value不是String,但是autoId键没有值,只有它下面的子uid有值"vierde"

我问你们两个可能的解决方案:

1) 如何在不使用 autoId 的情况下使用相同的 uid 保存多个功能?2) 如果我必须使用 autoId,我如何确保它观察到 autoId 下的 uid 键的值,而不是 autoId 的不存在的值。

感谢您的帮助!

最佳答案

我认为这个问题的答案是根据数据的键值对构建一个字典,并将其存储为您的 uid 节点的子节点

let featureDict = [ "feature_0": "cool feature", "feature_1": "great feature"]

let ref = DataService.dataService.FEATURE_REF.childByAppendingPath(uid)

ref.setValue(featureDict)

结果

the_uid
feature_0: "cool feature"
feature_1: "great feature"

这里的限制是 key 的名称,然后是添加更多关于每个功能的数据的能力。

这里有一个可能更好的选择

the_uid
auto_id_0
feature_name: @"cool feature"
summary: "Everything you'd ever want to know about this feature"
auto_id_1
feature_name: @"great feature"
summary: "Info about this great feature"

auto_id_x 由 autoId 生成,允许您添加任意数量的特性,更改它们的名称和摘要。等等。每个 auto_id_x 的子项都(或可能)存储在字典中,并按照上述示例进行保存。

关于ios - 使用 Swift 在 Firebase 中添加值而不是更改值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36083071/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com