android - 删除聊天开头的方法
问题描述
我想使用 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) {
}
});
解决方案
欢迎来到堆栈溢出!
从功能上讲,让客户负责管理消息的方法可能会奏效,但正如您所怀疑的那样,这不是最佳解决方案。一方面,这意味着客户端必须被授权删除/修改所有消息,无论是哪个用户发布的(毕竟最旧的消息可能是由任何用户发布的)。即使不知道您的确切用例,我也怀疑您是否希望允许一个用户删除其他人发布的消息。
相反,您所描述的功能听起来应该是服务器的责任,而不是客户端的责任。
为此,您可以利用 Firebase 的Cloud Functions(特别是通过实时数据库触发器,最有可能),这应该允许您有效地运行您描述的相同的“onChildAdded”代码,但在服务器上。这样,您只需要授权服务器修改所有消息,客户端不必参与。
(注意:虽然从您的架构中看起来不是这样,但如果您实际上的意思是您只想保留每个用户的 200 条最新消息,那么授权就不会那么重要了。不过,这样做可能是个好主意将这种责任放在服务器端,如果只是因为它允许您随时更改逻辑,而无需为您的客户端部署新版本。总的来说,这种“数据维护”从根本上更适合作为服务器的责任。)
推荐阅读
- bash - 历史搜索 (ctrl+r) 溢出终端并带有“偶然”输出
- android - Expo React-Native:深度链接在 android 上不起作用
- java - Catalina 上的 Aptana 3 错误 - 需要旧版 Java Runtime 6
- java - 我正在尝试创建一个带有 if 语句的 for 循环,以在 arraylist 中查找特定名称
- python - 如何在 Pandas 中将类似的列名组合成单独的行
- java - 为什么我的对象无法创建?
- c# - 选择列表/下拉列表中的表格类别列表
- java - 如何在 JavaFX 的 intersects 方法中添加侦听器?
- python - 我不知道如何解决这个错误:TypeError: authenticate_name() missing 1 required positional argument: 'eUsername'
- firebase - Flutter & Firestore - 如何在使用多个查询时创建不同的文档列表?