作者:太完美无缺_817 | 来源:互联网 | 2023-08-11 19:01
此刻,用户已存储在我的实时Firebase数据库中。
用户类别包含:
private String uid;
private UserPermissions userPermissions;
private List- items;
列表 项 默认为空,这将导致以下数据库结构:
按钮用于将项目添加到当前用户的列表中。
当前,我正在尝试通过整个用户对象来更新数据库,如下所示:
ref = FirebaseDatabase.getInstance().getReference().child("users");
[...]
Button dialogButton = (Button) dialog.findViewById(R.id.addItem);
dialogButton.setOnClicklistener(new View.OnClicklistener() {
@Override
public void onClick(View v) {
ref.setvalue(user);
dialog.dismiss();
}
});
结果如下:
层次结构已损坏。
在不将整个用户对象设置为数据库的情况下,是否还有其他可能性可以更新现有用户的列表项?如果没有,怎么可能防止这个问题?
如何用where条件更新与MySQL语法相似的用户?
UPDATE `ingredients` SET `ingredient` = `new_value' WHERE `uid` = `PClW...`;
谢谢您的帮助!
请记住,在Firebase RTDB数据模型中,给定节点始终包含其所有子项,这可能会很有帮助。在Firestore中可能实际上没有表的概念,甚至没有“集合”的概念。
这很重要,因为您正在调用setValue()
,它将调用它的引用设置为传递的确切值-它执行完全替换。用documentation的话来说:
以这种方式使用setValue()会覆盖指定位置(包括所有子节点)上的数据。
在这种情况下,您使用的引用指向users
节点,而不是当前用户的节点。因此,您看到的是整个users
节点被单个用户的值替换。
您有两个选择。
第一个也是最直接的方法是获取要更新的特定用户的节点的引用setValue
:
ref = FirebaseDatabase.getInstance().getReference()
.child("users").child(uid);
请注意,这里的uid
实际上是您要更新的节点(在本例中为-LuxronyXRi8s85SBvVf
)的键。它不是该节点的uid子节点的值。如果您由于不知道而需要查找密钥,则需要自己遍历users
节点的所有子级,直到找到它为止,或者尝试通过filter query查找它。
当然,我们不能保证(至少不是Firebase RTDB提供的任何保证)只有一个子节点具有该特定的uid
值。
此外,如果您只想更新用户节点下的一个字段,则只需获取对该字段的引用即可(同样,此处的uid指向您要更新的节点的 key ):
ref = FirebaseDatabase.getInstance().getReference()
.child("users").child(uid).child("userPermissions");
或者,如果您要写入一个节点的多个子节点,而又不改变其他子节点的位置,则可以使用updateChildren()
。请参阅文档here和reference here。可以将子路径映射到要更新的值,但是这种情况可能比您需要的复杂,因为您似乎正试图完全更新一个用户。