gpt4 book ai didi

java - 如何更新 Firebase 数据库中的子节点数据?

转载 作者:行者123 更新时间:2023-11-29 19:02:14 25 4
gpt4 key购买 nike

其实我有一个数据库,里面有多个用户。每个用户都有自己的数据,其中还包括一个“任务”类型的对象数组。我想做的是更新特定任务的数据。我试过 ref.child (userId).child ("Tasks") .child ("done").setValue (isDone); ,但在数据库中添加了一个新条目。所以我的问题是,当我们不知道子节点的 UID 时如何更新子节点的数据节点?我正在添加我的数据库的快照,这里的用户有 UID,下面有包含任务数据的 TASKS,所以我必须更新特定任务的数据,怎么做?请帮忙。

enter image description here

我尝试了 Peter 的解决方案,但数据更新如下:

enter image description here

但只有“完成”应该被更新。

最佳答案

试试这个:

DatabaseReference ref= FirebaseDatabase.getInstance().getReference().child(userId).child("Tasks");

ref.orderByChild("name").equalTo(nameofthetask).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if (dataSnapshot.exists()) {
for (DataSnapshot datas : dataSnapshot.getChildren()) {
String key=datas.getKey();
String name=datas.child("name").getValue().toString();
String priorities=datas.child("priority").getValue().toString();
ref.child(key).child("done").setValue(isdone);
ref.child(key).child("name").setValue(name);
ref.child(key).child("priority").setValue(priorities);

}
}
}
@Override
public void onCancelled(FirebaseError firebaseError) {

}

});

可以做上面的,因为用户正在更新任务,那么你可以做一个查询,这将等于用户正在更新的任务。然后检查它是否存在于用户节点下的数据库中,并更新子 done

解释:

首先,您引用 dataSnapshot,在本例中它是 Tasks:

  DatabaseReference ref= FirebaseDatabase.getInstance().getReference().child(userId).child("Tasks");

现在我们在这里:

       users
userId
Tasks <----- here

其次,通过使用这个 ref.orderByChild("name").equalTo(nameofthetask) 。这就像说子 name 等于称为任务 1 的任务。

第三,if (dataSnapshot.exists()) { 检查数据库中是否存在上述所有内容。

第四,在节点 Tasks 的直接子节点中循环,因此我将能够获得 key 。 String key=datas.getKey();应该是上面例子中写的name的key:

  users
userId
Tasks
123456 <----------- this will be the key retrieved.
name: task 1
done: false
priority: 5

之后,我还根据需要检索 namepriority,这样如果没有 namepriority 节点就不会被覆盖。

获取以上内容后:

    ref.child(key).child("done").setValue(isdone);
ref.child(key).child("name").setValue(name);
ref.child(key).child("priority").setValue(priorities);

我使用上面的代码来更新关键节点下的所有 3 个属性。这不应该创建另一个 key 节点,因为它已经存在于数据库中并且不能有两个相同的 key 。所以这会发生:

(在 setValue() 之前)

users
userId
Tasks
123456
name: task 1
done: false <------ We need to update done
priority: 5

(在 setValue() 之后)

users
userId
Tasks
123456
name: task 1
done: true <------ updated
priority: 5

关于java - 如何更新 Firebase 数据库中的子节点数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48576560/

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