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

标签 java android firebase firebase-realtime-database

其实我有一个数据库,里面有多个用户。每个用户都有自己的数据,其中还包括一个“任务”类型的对象数组。我想做的是更新特定任务的数据。我试过 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/

相关文章:

java - 从 JList 中删除所有选定的元素?

android - HTC WildFire 上的 SharedPreferences EditText 对话框被挤压

ios - Firebase 数据库不等于请求 - 替代解决方案(适用于 iOS)

ios - Swift - 为聊天应用构建 Firebase 数据

基于查询的android firebase查询

java - 从 @ScheduledfixedRate 的属性文件中获取值时出错

java - 使用 javamail 读取 gmail 电子邮件时偶尔出现 javax.mail.FolderClosedException

用于比较声音的java sdk

android - 使用国际字符将 JSON 从 Android 发送到 .NET WCF。如何?

java - 基本网络.performRequest : Unexpected response code 500 Android