android-studio - Android studio如何正确删除聊天中的消息
问题描述
我在删除聊天应用程序中的消息时遇到问题。我有两种类型的消息,图像和文本。我像这样删除它们:
DatabaseReference dbRef = FirebaseDatabase.getInstance().getReference("Chats");
Query query = dbRef.orderByChild("time").equalTo(msgTimeStamp);
query.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
for(DataSnapshot ds: snapshot.getChildren()) {
if (ds.child("sender").getValue().equals(myUID) && !ds.child("message").getValue().toString().equalsIgnoreCase("This message was deleted")) {
holder.messageLayout.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
final AlertDialog.Builder builder = new AlertDialog.Builder(mContext);
View view = LayoutInflater.from(mContext).inflate(R.layout.custon_view_for_dialog, null);
builder.setView(view);
Button delete = view.findViewById(R.id.delete);
Button cancel = view.findViewById(R.id.cancel);
final AlertDialog dialog = builder.create();
dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
delete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
deleteMessage(position);
dialog.dismiss();
}
});
cancel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dialog.dismiss();
}
});
dialog.show();
return true;
}
});
}
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
}
这是删除功能:
private void deleteMessage(int position) {
String msgTimeStamp = mChats.get(position).getTime();
DatabaseReference dbRef = FirebaseDatabase.getInstance().getReference("Chats");
Query query = dbRef.orderByChild("time").equalTo(msgTimeStamp);
query.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
for (final DataSnapshot ds: snapshot.getChildren())
{
if(ds.child("type").getValue().equals("text"))
{
HashMap<String, Object> hashMap = new HashMap<>();
hashMap.put("message", "This message was deleted");
ds.getRef().updateChildren(hashMap);
}
else
{
FirebaseStorage firebaseStorage = FirebaseStorage.getInstance();
StorageReference storageReference = firebaseStorage.getReferenceFromUrl(ds.child("message").getValue().toString());
storageReference.delete().addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
HashMap<String, Object> hashMap = new HashMap<>();
hashMap.put("message", "This message was deleted");
hashMap.put("type","text");
ds.getRef().updateChildren(hashMap);
}
});
}
}
所以我的想法是如果消息是文本,那么我将文本设置为“此消息已删除”,如果消息是图像,我将其类型更改为文本并将其也设置为“此消息已删除”并删除来自 Firebase 存储的图像。删除对我有用,这是删除后的样子:
我面临的问题是,即使它已经被删除,我仍然可以删除该消息!AlertDialog
当我单击已删除的消息时,我不希望出现删除 !!。
如您所见,我将此添加到我的条件中:
!ds.child("message").getValue().toString().equalsIgnoreCase("This message was deleted")
但问题依然存在,已删除的消息可以多次删除!我怎样才能防止这种情况发生?请帮忙
解决方案
推荐阅读
- ionic-framework - ionic capacitor sign in with apple and getting name
- sql - How to user grouping sets as keys for the next grouping
- flutter - Error: The method 'ignore' isn't defined for the class 'Future
' in flutter build - sql - Why am I receiving an Error 2F0F5E42 (Missing Parenthesis) in my SQL script when it appears they are all present?
- heroku - 为什么 Heroku 找不到 jar 文件?
- three.js - Three.js 灯看起来像云纹
- javascript - ipcMain 没有从 ipcRenderer 接收任何信息
- html - 图像和文本通过边框剪裁
- django - Django 迁移树问题 - 部署 PythonAnywhere
- reactjs - 从子下拉列表中获取价值