我想使用 Firebase 实时数据库开发一个聊天应用程序,让许多人可以同时聊天。所有消息都应该存储在那里:
->1
->user
->message
->2
->user
->message
...
但如果消息数量过多(例如 200 条),则应删除最后 10 条消息。
所以我尝试的(但显然这不是最好的解决方案)如下: 你可以让每部手机都这样做,如下所示:
myReference.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
if(dataSnapshot.getChildrenCount() > 200){
//Here would be the code to delete it
}
}
@Override
public void onChildChanged(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
}
@Override
public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) {
}
@Override
public void onChildMoved(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
最佳答案
欢迎来到 Stack Overflow!
从功能上讲,您让客户负责管理消息的方法可能会奏效,但正如您所怀疑的那样,这不是最佳解决方案。其一,这意味着客户端必须获得删除/修改所有消息的授权,无论是哪个用户发布的(毕竟最旧的消息可能已经由任何用户发布)。即使不知道您的确切用例,我怀疑您是否希望允许一个用户删除其他人发布的消息。
相反,您所描述的功能听起来应该由服务器而不是客户端负责。
为此,您可以利用 Firebase 的 Cloud Functions (特别是通过 Realtime Database triggers ,最有可能),这应该允许您有效地运行您描述的相同“onChildAdded”代码,但在服务器上。 这样,您只需授权服务器修改所有消息,而客户端不必参与。
(注意:虽然从您的架构看来并非如此,但如果您实际上是想只保留 每个用户 的 200 条最新消息,那么授权就不是那么重要了。尽管如此,将这种责任放在服务器端可能是个好主意,因为它允许您随时更改逻辑,而不必为您的客户端部署新版本。一般来说,这种“数据维护”从根本上说更适合作为服务器的职责。)
关于android - 删除聊天开头的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54202618/