[英]How to update an object in firebase-realtime-database correctly?
目前用户存储在我的实时 firebase 数据库中。
用户类包含:
private String uid;
private UserPermissions userPermissions;
private List<Item> items;
默认情况下,列表项为空,这导致以下数据库结构:
Button 用于将项目添加到当前用户的列表中。
目前我正在尝试通过整个用户对象更新数据库,如下所示:
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()
,它将您调用它的引用设置为传递的确切值——它执行完全替换。 用文档的话来说:
以这种方式使用 setValue() 会覆盖指定位置的数据,包括任何子节点。
在这种情况下,您使用的引用指向users
节点,而不是当前用户的节点。 因此,您看到的是整个users
节点被替换为单个用户的值。
你有两个选择。
第一个也是最直接的是获取对要更新的特定用户的节点的引用调用setValue
:
ref = FirebaseDatabase.getInstance().getReference()
.child("users").child(uid);
请注意,这里的uid
实际上是您要更新的节点的密钥(在本例中-LuxronyXRi8s85SBvVf
)。 它不是该节点的 uid 子节点的值。 如果您因为不知道密钥而需要查找它,则需要自己遍历users
节点的所有子节点直到找到它,或者尝试通过过滤器查询找到它。
当然,不能保证(至少 Firebase RTDB 不能保证)只有一个子节点具有特定的uid
值。
此外,如果您只想更新用户节点下的一个字段,那么只需获取对该字段的引用(同样,这里的 uid 指的是您要更新的节点的键):
ref = FirebaseDatabase.getInstance().getReference()
.child("users").child(uid).child("userPermissions");
或者,如果您想写入一个节点的多个子节点,同时保留其他子节点,您可以使用updateChildren()
。 请参阅此处的文档和此处的参考。 这可以将子路径映射到要更新的值,但在这种情况下可能比您需要的更复杂,因为您似乎正在尝试完全更新一个用户。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.