当前位置: 首页 > 知识库问答 >
问题:

事务中的Firebase多位置更新?

衡安晏
2023-03-14

我需要帮助找出使用Firebase的最佳方式。我正在制作一个twitter克隆,但与FireFeed不同,我的帖子是可变的。

我的数据库结构如下:

房间,基本上是一个你可以订阅的帖子提要。会议室成员可以向该会议室发帖:

  1. 房间/{房间ID}/帖子/{postId}/-

用户,所有用户的全局列表:

  1. 用户/{userId}/feed/{postId}-

帖子,实际帖子内容的全球列表:

  1. 贴子/{postId}/评论/{评论Id}-

学校,房间列表:

  1. 学校/{学校名称}/房间/{房间名称}/info-

现在,前两个用例已经很好了。困惑来自于如何制作和编辑对帖子的引用。我的用例是:

用例0:用户想要创建一个房间。

  1. 多位置将房间对象更新为/rooms/,并将相应的房间摘要对象更新为schools/{schoolId}/rooms/,以及users/{userId}/rooms/

用例1:用户想要订阅一个房间。

  1. 在rooms/{roomId}/上运行事务。将{userId}添加到rooms/{roomId}/users/并将房间大小增加1

用例2:用户想在房间里做一个帖子。

  1. 从文件室/{roomId}/users检索用户列表

这样做的问题是,如果另一个用户在我们的用户检索到用户列表后立即加入这个房间,那么他就不是接收这个新帖子的多位置更新的一部分。

当我试图更新帖子的评论数量时,我也面临着类似的难题。如果一个帖子有15条评论,并且有两个人同时在这个帖子中添加了一条新评论,那么在事务中完成时,全局帖子对象将正确更新为17条,但是根据之后扇出的顺序,每个人的帖子摘要对象可能有16条评论。当用户加入房间时,房间的大小也是如此。

我该怎么做呢?有没有一种方法可以更好地建模我的数据,或者有没有一种方法可以在事务期间正确地进行多位置更新?

共有1个答案

白光耀
2023-03-14

当我看到你的用例时,我认为你让你的数据模型有点太复杂了。

Firebase对我来说就像:

  1. 没有sql数据存储

这意味着我不会存储这个users/{userId}/feed/{postId},而是在客户端登录时执行以下操作:

  1. 连接到用户订阅的每个房间
  2. 获取所有最近的帖子从订阅房间
  3. 命令客户端的帖子

这样,当某人发表新帖子/评论时,它将只在一个位置写入房间/{房间ID}/帖子/

我还会删除您的计数器喜欢/发布/评论,当我想要此信息时,请调用方法为数字儿童,以避免不必要的并发访问。

 类似资料:
  • 我正在尝试使用Firebase消息传递(web)。默认情况下,Firebase会搜索包含服务工作者的文件“Firebase messaging sw.js”。 服务工作者脚本应位于应用程序的绝对路径上!例如:http://localhost/firebase-messaging-sw.js 如何更改此默认位置?!搜索官方文档,我发现了这个方法:,它接受服务工作者注册,但试图使用它,我得到一个错误,

  • 我需要每1分钟和每5米位移更新一次熔合位置(我知道这是一个错误的做法,但为了测试和在日志中显示),并且我在按下按钮后立即启动服务,我在logcat中获得位置,但只有一次。根据服务级别,onLocationChanged应该每1分钟调用一次,但它不会再次调用,即使我的GPS几乎每分钟打开一次,然后在之后关闭,但Logcat中仍然没有位置更新。我需要服务类来保持更新位置,而不影响UI或主线程 这是只显

  • 问题内容: 我正在开发一个用于清洁服务的应用程序。在此应用程序中,员工(清洁工)可以读取由多个客户(用户)完成的作业(预订)列表。 所有清洁工都可以在“用户”节点中读取所有预订。最初,当用户将预订保存在数据库中时,该键的值为 ,这意味着清洁工尚未声明该键。 每当清洁工想要索取列表中存在的工作时,他将必须触摸按钮,该按钮将向Firebase数据库发出请求以将key的值修改为at路径。 一次只能允许一

  • 我有一个后台服务,每12分钟更新一次位置。我们希望每5-6分钟测试一次位置更新,但在Android文档中我们发现: 为了降低功耗,Android8.0(API Level26)限制了后台应用程序检索用户当前位置的频率。应用程序每小时只能接收几次位置更新。 限制是每小时固定次数?

  • 我想知道什么是电池效率最高的方式发送准确的位置更新到服务器/防火墙每5秒,即使应用程序关闭或手机重新启动。我尝试使用alarmmanager.setrepeating和android.intent.action.boot_completed接收器- 使用post一个延迟消息或runnable到一个处理程序不是一个可靠的解决方案,因为一旦应用程序被删除,位置更新就会停止。 是否有可靠的方法每5秒向服

  • 这就是我的Firebase中的实时数据库在发送用户当前位置时的样子,而不使用唯一的ID。 但是,当在代码中使用push()时,它会不断地在每次刷新位置时生成新的ID。 是否可以在不生成新的唯一id的情况下不断更新用户的位置或完全删除对位置的更新?