热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

如何正确更新firebaserealtimedatabase中的对象?

此刻,用户已存储在我的实时Firebase数据库中。用户类别包含:privateStringui

此刻,用户已存储在我的实时Firebase数据库中。

用户类别包含:

private String uid;
private UserPermissions userPermissions;
private List items;

列表 默认为空,这将导致以下数据库结构:

如何正确更新firebase-realtime-database中的对象?

按钮用于将项目添加到当前用户的列表中。

当前,我正在尝试通过整个用户对象来更新数据库,如下所示:

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();
}
});

结果如下:

如何正确更新firebase-realtime-database中的对象?

层次结构已损坏。

在不将整个用户对象设置为数据库的情况下,是否还有其他可能性可以更新现有用户的列表项?如果没有,怎么可能防止这个问题?

如何用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。可以将子路径映射到要更新的值,但是这种情况可能比您需要的复杂,因为您似乎正试图完全更新一个用户。


推荐阅读
  • 获取年月日,之前的日期不能选择日历cCalendar.getInstance();获取系统的工具类【可以获取时间】DatePickerDialogdate ... [详细]
  • 使用URLHttpConnection获取并展示图片至ImageView的方法
    本文介绍如何通过URLHttpConnection方式从网络加载图片,并将其显示在Android应用的ImageView组件上。包括布局文件和Java代码的具体实现。 ... [详细]
  • Android 5 及以上版本中使用存储访问框架(SAF)实现 SD 卡写入权限的方法
    本文探讨了在 Android 5 及更高版本中通过存储访问框架(Storage Access Framework, SAF)实现对 SD 卡文件的写入与重命名操作。文章分析了 SAF 的工作原理,并提供了一个示例应用的代码实现,展示了如何正确获取并使用用户授予的写入权限。 ... [详细]
  • 深入解析 Android 中的 ActivityGroup 实现
    本文详细探讨了如何在 Android 应用中使用 ActivityGroup 来实现类似微博客户端主界面的效果,并分析了 TabActivity 的局限性,推荐使用更为灵活的 ActivityGroup 方案。 ... [详细]
  • 本文通过对OkHttp源码的详细解读,旨在帮助读者理解其核心执行流程,特别是同步与异步请求的处理方式。文中不仅涵盖了基本的使用示例,还深入探讨了OkHttp的核心功能——拦截器链的工作原理。 ... [详细]
  • Android 网络状态检测工具类
    本文提供了一个用于检测Android设备网络状态的工具类,包括网络连接性、WiFi和3G网络的检测以及GPS状态的检查。 ... [详细]
  • 本文探讨了在 JavaFX 应用程序中使用 TableView 组件时遇到的滚动条问题,特别是当表格数据变化时,水平滚动条无法自动复位至初始位置的情况。 ... [详细]
  • 本文探讨了在JavaScript中如何有效地从服务器控件DropDownList中获取绑定的ID值,而非仅仅是显示的文本值。这对于需要根据用户选择动态处理数据的应用场景非常有用。 ... [详细]
  • 深入理解SAP Fiori及其核心概念
    本文详细介绍了SAP Fiori的基本概念、发展历程、核心特性、应用类型、运行环境以及开发工具等,旨在帮助读者全面了解SAP Fiori的技术框架和应用场景。 ... [详细]
  • 本文旨在探讨Linux系统中两种重要的进程间通信(IPC)机制——System V和POSIX的标准及其特性,为开发者提供深入的理解。 ... [详细]
  • 【java】关键字、代码块、接口、枚举学习笔记
    主要内容1关键字2代码块3接口4枚举1Java中的关键字1.1static关键字用一句话说就是:可以直接通过对象.的形式使用,不用new实 ... [详细]
  • 电子与正电子的相互作用
    本文探讨了电子与正电子之间的基本物理特性及其在现代物理学中的应用,包括它们的产生、湮灭过程以及在粒子加速器和宇宙射线中的表现。 ... [详细]
  • 深入解析Android UI布局:LinearLayout与AbsoluteLayout
    本文探讨了Android开发中常用的两种布局方式——LinearLayout和AbsoluteLayout,通过实例分析它们的特点及应用场景。 ... [详细]
  • 本文提供了一个Android应用中用于抓取网页信息并下载图片的示例代码。通过该代码,开发者可以轻松实现从指定URL获取网页内容及其中的图片资源。 ... [详细]
  • 使用EF Core在.Net Core控制台应用中操作SQLite数据库
    本文介绍如何利用Visual Studio 2019和Windows 10环境,通过Entity Framework Core(EF Core)实现对SQLite数据库的读写操作。项目源代码可从百度网盘下载。 ... [详细]
author-avatar
太完美无缺_817
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有