【问题标题】:Updating multiple paths in Firebase Database更新 Firebase 数据库中的多个路径
【发布时间】:2020-04-15 18:56:23
【问题描述】:

我的应用中有两个实体 - UserShift。它们共享多对多关系。

这就是我使用非规范化技术和 4 个顶级节点构建数据库的方式:

{
   "shift-assign":{
      "-Lwo52vuW9QqCmAfS90w":{
         "111":{
            "email":"john@gmail.com",
            "firstName":"John",
            "id":"111",
            "lastName":"Smith",
            "password":"111",
            "phone":"555",
            "wage":30.0
         },
         "222":{
            "email":"jane@gmail.com",
            "firstName":"Jane",
            "id":"222",
            "lastName":"Doe",
            "password":"222",
            "phone":"678",
            "wage":32.5
         }
      },
      "-Lwsj8yE6HW2IUoTVJ0G":{
         "111":{
            "email":"john@gmail.com",
            "firstName":"John",
            "id":"111",
            "lastName":"Smith",
            "password":"111",
            "phone":"555",
            "wage":30.0
         }
      }
   },
   "shifts":{
      "-Lwo52vuW9QqCmAfS90w":{
         "date":"20191224",
         "endTime":"12:00",
         "key":"-Lwo52vuW9QqCmAfS90w",
         "startTime":"10:00"
      },
      "-Lwsj8yE6HW2IUoTVJ0G":{
         "date":"20191224",
         "endTime":"14:00",
         "key":"-Lwsj8yE6HW2IUoTVJ0G",
         "startTime":"11:00"
      }
   },
   "user-assign":{
      "111":{
         "-Lwo52vuW9QqCmAfS90w":{
            "date":"20191224",
            "endTime":"12:00",
            "key":"-Lwo52vuW9QqCmAfS90w",
            "startTime":"10:00"
         },
         "-Lwsj8yE6HW2IUoTVJ0G":{
            "date":"20191224",
            "endTime":"14:00",
            "key":"-Lwsj8yE6HW2IUoTVJ0G",
            "startTime":"11:00"
         }
      },
      "222":{
         "-Lwo52vuW9QqCmAfS90w":{
            "date":"20191224",
            "endTime":"12:00",
            "key":"-Lwo52vuW9QqCmAfS90w",
            "startTime":"10:00"
         }
      }
   },
   "users":{
      "99999":{
         "email":"",
         "firstName":"Admin",
         "id":"99999",
         "lastName":"",
         "password":"111",
         "phone":"",
         "wage":0
      },
      "111":{
         "email":"john@gmail.com",
         "firstName":"John",
         "id":"111",
         "lastName":"Smith",
         "password":"111",
         "phone":"555",
         "wage":30.0
      },
      "222":{
         "email":"jane@gmail.com",
         "firstName":"Jane",
         "id":"222",
         "lastName":"Doe",
         "password":"222",
         "phone":"678",
         "wage":32.5
      }
   }
}

我可以插入、读取和删除 UserShift 对象,但是在更新它们时,事情变得有点复杂。

例如,如果我想更新用户的工资,我必须遍历分配给用户的所有班次(在 user-assign/$id 下),存储所有班次的键,然后参考 shift-assign/$shift-key每个存储的密钥并更新工资。 这将需要嵌套的EventListener,这是我试图避免的。

显然更新Shift 节点也会出现同样的问题。

有没有更好的方法来解决这个问题?

【问题讨论】:

  • 如果用户的所有班次都在user-assign/111 之下,则需要一个侦听器来读取它们。如果您编辑问题以显示您尝试过的内容,这可能会有所帮助。

标签: android firebase firebase-realtime-database nosql


【解决方案1】:

您实际上应该只在user-assignshift-assign 节点中引用id,而不是整个对象。非规范化不需要您创建整个文档的重复副本。例如,简化您的结构会导致:

{
   "shift-assign":{
      "-Lwo52vuW9QqCmAfS90w": ["111", "222"],
      "-Lwsj8yE6HW2IUoTVJ0G": ["111"]
   },
   "shifts":{
      "-Lwo52vuW9QqCmAfS90w":{
         "date":"20191224",
         "endTime":"12:00",
         "key":"-Lwo52vuW9QqCmAfS90w",
         "startTime":"10:00"
      },
      "-Lwsj8yE6HW2IUoTVJ0G":{
         "date":"20191224",
         "endTime":"14:00",
         "key":"-Lwsj8yE6HW2IUoTVJ0G",
         "startTime":"11:00"
      }
   },
   "user-assign":{
      "111":["-Lwo52vuW9QqCmAfS90w", "-Lwsj8yE6HW2IUoTVJ0G"],
      "222":["-Lwo52vuW9QqCmAfS90w"]
   },
   "users":{
      "99999":{
         "email":"",
         "firstName":"Admin",
         "id":"99999",
         "lastName":"",
         "password":"111",
         "phone":"",
         "wage":0
      },
      "111":{
         "email":"john@gmail.com",
         "firstName":"John",
         "id":"111",
         "lastName":"Smith",
         "password":"111",
         "phone":"555",
         "wage":30.0
      },
      "222":{
         "email":"jane@gmail.com",
         "firstName":"Jane",
         "id":"222",
         "lastName":"Doe",
         "password":"222",
         "phone":"678",
         "wage":32.5
      }
   }
}

然后,您可以只执行客户端连接来检索它们的关联对象。

这有几个优点:

  1. 如果您要更新用户的数据,则不必更新任何节点中的所有其他用户。同样,如果您要更新班次,您只需在一处更新即可。
  2. 节省存储空间 - 同样,您不必创建相同文档的副本。您只需要他们的 id 并在一个地方检索它。

【讨论】:

    【解决方案2】:

    使用map作为路径(refrance之后)和值,然后使用updateChildren方法

    如果你想更新多个用户名,就像 ex

    Map<String, Object> map = new HashMap<>();
    //key for path and value in map for value in node 
    map.put("/users/" + userId1 + "/name/", "ahmad");
    map.put("/users/" + userId2 + "/name/", "mahmoud");
    map.put("/users/" + userId3 + "/name/", "martin");
    map.put("/users/" + userId4 + "/name/", "nameValue");
    //and so on
    myRootRef.updateChildren(map);
    

    等等,如果你有多个数据,你可以使用循环

    【讨论】:

      猜你喜欢
      • 2018-12-01
      • 2017-11-12
      • 1970-01-01
      • 2017-11-13
      • 1970-01-01
      • 1970-01-01
      • 2018-12-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多