如何更新Firebase中的特定节点?

时间:2016-10-21 03:19:37

标签: firebase swift3 firebase-realtime-database nosql

如何更新现有员工的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下创建了另一个节点:

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

2 个答案:

答案 0 :(得分:3)

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])
})

答案 1 :(得分:1)

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

#include <iostream>
using namespace std;
int main()
  {

    int i=10, j=5;
    int modResult;
    int divResult;
    modResult = i%j;
    cout << modResult;
    divResult = i/modResult; 
    cout << divResult;
    return 0;
}

希望这有帮助