【问题标题】:How to update specific node in Firebase?如何更新 Firebase 中的特定节点?
【发布时间】:2017-08-26 09:40:19
【问题描述】:

如何更新现有员工的 eImageUrl?我尝试访问的节点如下所示:

Employees
  KTpWLCrQTTSfQnTCn5w
    eId : "1000"
    deptId : "10"
    eImageUrl ""
  KTqWLCrVVTMfQsTCw6n
    eId : "1001"
    deptId : "10"
    eImageUrl ""

KTpWLCrQTTSfQnTCn5w 等每个员工的值是使用 childByAutoId() 自动生成的。

我有要更新的员工的eId。我尝试了以下方法:

databaseRef.child("Employees").child("10001").setValue(["eImageUrl": eImageUrl])

但这会在员工下创建另一个节点:

Employees
  KTpAQCrYIBSfQxTCn2w
    eImageUrl "https://firebasestorage.googleapis.com/c0/myapp.com/a/employee.jpg"

【问题讨论】:

    标签: firebase swift3 firebase-realtime-database nosql


    【解决方案1】:

    Firebase 的推送 ID 非常适合没有自然键的项目集合或需要按时间顺序存储的项目。但是,当项目确实有一个自然键时,您通常最好将它们存储在该键下。

    所以在这种情况下,我会考虑将员工存储在员工 ID 下。

    Employees
      "eId_1000"
        deptId : "10"
        eImageUrl ""
      "eId_1001"
        deptId : "10"
        eImageUrl ""
    

    我为员工 ID 指定了一个字母数字前缀,以确保 Firebase 客户端不会尝试将它们解释为数组。

    有了这个结构,你可以用updateChildValues()修改员工记录:

    databaseRef.child("Employees").child("eId_10001").updateChildValues(["eImageUrl": eImageUrl])
    

    或调用树中低一级的setValue()

    databaseRef.child("Employees/eId_10001/eImageUrl").setValue(eImageUrl)
    

    更新

    由于您表示要坚持当前的数据结构,因此此查询将适用:

    let employees = databaseRef.child("Employees")
    let query = employees.queryOrdered(byChild: "eId").queryEqual(toValue: "1000")
    query.observe(.childAdded, with: { (snapshot) in
        snapshot.ref.updateChildValues(["eImageUrl": eImageUrl])
    })
    

    【讨论】:

    • 我不想那样做,因为你必须确保 ID 不存在。随机 ID 更好,但最好由 Firebase 创建。
    • 我已使用适用于您当前数据结构的查询更新了我的答案。但是您的代码表明您已经假设 eId 是唯一的。我会考虑转向与您在实践中的想法相匹配的数据模型。
    • 谢谢。我将使用您的建议,并让自动生成的员工 ID(由 Firebase)成为每个节点的根,而不是一些自动生成的未关联 ID。
    【解决方案2】:

    您需要先获取 pushid 才能执行数据库更新

    databaseRef.child('Employees').orderByChild('eId').equalTo(1001).on('value',function(snapshot){
    
    snapshot.forEach(function(data) {
    
       databaseRef.child("Employees/"+data.key+"/eImageUrl").set(eImageUrl); 
    
                                    });  });
    

    希望这有帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-02
      • 1970-01-01
      • 1970-01-01
      • 2019-10-29
      • 1970-01-01
      • 1970-01-01
      • 2017-08-24
      • 1970-01-01
      相关资源
      最近更新 更多