【发布时间】: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 : boolean 将reads 做成了一个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 arrays 和proposes 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