【问题标题】:Firebase: Add value to array without possibly overwritingFirebase:向数组添加值而不可能覆盖
【发布时间】:2017-02-17 08:38:56
【问题描述】:

我有一个消息应用程序,其模型看起来像这样

public class Message {
    String message;
    List<String> reads;

    ... more logics
}

在 firebase 上看起来像这样

... [ 
   "myGeneratedMessageId" : {
       "from":"userId1",
       "reads":[
          "userId2",
          "userId3"
       ]
   }, ...

]

当用户看到它时,应该将用户的 id 添加到数组中。如果多个用户同时看到它,我是否需要担心覆盖该数组中的值?我该怎么做才能避免这种情况发生?

为了澄清,

用户 1 看到消息 -> 将用户 ID 发送到该数组(我猜是通过将其添加到本地数组,然后在 Firebase 上更新消息上的该子项)

用户 2 在用户 1 更新消息之前看到消息,也对其进行更新 - 仅将他的 id 添加到数组中并在 Firebase 上更新子项

编辑:更新用法(潜在问题仍然存在)

我用id : booleanreads 做成了一个hashmap

 ... 
 "message": "Hello world!",
 "from": "userId1",
 "reads":[
     "userId2": true,
     "userId3": true
 ], ...

内模markAsRead()

if(reads == null) {
   reads = new HashMap<String, Boolean>(); <-- could cause problem
} 

if(reads.get(userId) == null) {
   reads.put(userId, true);
}

.. save logics

如果没有哈希图,用户仍然可以创建,从而使其他用户的新哈希图重写它。

【问题讨论】:

  • 使用数组时多用户冲突的可能性很大。这是Firebase recommends against using arraysproposes a different way to handling list structures 的众多原因之一。但是你看到的可能是better served with a set,很方便的解决了你提出的问题。
  • 我认为如果您直接在数据库中进行更改(当用户读取时),而不先将其添加到本地HashMap 中,则可以避免该问题。我的意思是使用...getReference("myGeneratedMessageId/reads/" + user.getUid).setValue(true)。而且由于消息对象是不断同步的,所以readHashMap的值也会更新

标签: java android arrays firebase firebase-realtime-database


【解决方案1】:

如果我理解正确,您担心的是您的 firebase 数据库上的并发更新。

如果是这样,您可以查看该部分

Save data as transactions

并检查这个答案:

Firebase - Multiple users simultaneously updating same object using its old value

【讨论】:

    猜你喜欢
    • 2018-07-15
    • 2015-05-08
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    • 2012-03-31
    • 2018-08-29
    • 1970-01-01
    • 2021-06-30
    相关资源
    最近更新 更多