首页 > 解决方案 > 删除聊天开头的方法

问题描述

我想使用 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) {

            }
        });

标签: androidfirebasefirebase-realtime-databasechat

解决方案


欢迎来到堆栈溢出!

从功能上讲,让客户负责管理消息的方法可能会奏效,但正如您所怀疑的那样,这不是最佳解决方案。一方面,这意味着客户端必须被授权删除/修改所有消息,无论是哪个用户发布的(毕竟最旧的消息可能是由任何用户发布的)。即使不知道您的确切用例,我也怀疑您是否希望允许一个用户删除其他人发布的消息。

相反,您所描述的功能听起来应该是服务器的责任,而不是客户端的责任。

为此,您可以利用 Firebase 的Cloud Functions(特别是通过实时数据库触发器,最有可能),这应该允许您有效地运行您描述的相同的“onChildAdded”代码,但在服务器上。这样,您只需要授权服务器修改所有消息,客户端不必参与。

(注意:虽然从您的架构中看起来不是这样,但如果您实际上的意思是您只想保留每个用户的 200 条最新消息,那么授权就不会那么重要了。不过,这样做可能是个好主意将这种责任放在服务器端,如果只是因为它允许您随时更改逻辑,而无需为您的客户端部署新版本。总的来说,这种“数据维护”从根本上更适合作为服务器的责任。)


推荐阅读