【问题标题】:Not able to delete firebase database records无法删除 Firebase 数据库记录
【发布时间】:2023-03-08 02:48:01
【问题描述】:

在我的应用程序中,它显示了我需要在 reRecyclerView 中显示的必要信息,但是当我尝试删除其中一个目录时却没有发生。但它执行 Item removed 短语并且该目录仍然存在。我需要从那里删除那些目录。这些数据是否仍保留在数据库中并不重要,因为我只想删除目录。有谁知道如何解决这个问题?谢谢

Firebase 数据库

这是完整的代码。


package com.example.policeemergencysystem;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.Switch;
import android.widget.TextView;
import android.widget.Toast;

import com.example.policeemergencysystem.Model.AdminOrders;
import com.firebase.ui.database.FirebaseRecyclerOptions;
import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.firebase.ui.database.FirebaseRecyclerAdapter;

public class AdminCategoryActivity extends AppCompatActivity {

    private RecyclerView ordersList;
    private DatabaseReference ordersRef, adminRef, mapRef;
    private Button backBtn;
    private String userID = "", userNAME = "", userPHONE = "";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_admin_category);

        userID = getIntent().getStringExtra("uid");
        userNAME = getIntent().getStringExtra("uname");
        userPHONE = getIntent().getStringExtra("uphone");
        ordersRef = FirebaseDatabase.getInstance().getReference().child("Users");
        adminRef = FirebaseDatabase.getInstance().getReference().child("Location");
        ordersList = findViewById(R.id.ordersList);
        ordersList.setLayoutManager(new LinearLayoutManager(this));
    }

    @Override
    protected void onStart()
    {
        super.onStart();
        FirebaseRecyclerOptions<AdminOrders> options =
                new FirebaseRecyclerOptions.Builder<AdminOrders>()
                        .setQuery(ordersRef, AdminOrders.class)
                        .build();

        FirebaseRecyclerAdapter<AdminOrders, AdminOrdersViewHolder> adapter =
                new FirebaseRecyclerAdapter<AdminOrders, AdminOrdersViewHolder>(options) {
                    @Override
                    protected void onBindViewHolder(@NonNull final AdminOrdersViewHolder holder, final int position, final @NonNull AdminOrders model)
                    {
                        holder.userName.setText("Name : "+ model.getName());
                        holder.userPhoneNumber.setText("Phone Number : "+ model.getPhone());
                        holder.viewLocationBtn.setOnClickListener(new View.OnClickListener() {
                            @Override
                            public void onClick(View v) {
                                String uID = getRef(position).getKey();
                                String uNAME = getRef(position).getKey();
                                String uPHONE = getRef(position).getKey();
                                Intent intent = new Intent(AdminCategoryActivity.this, AdminViewMapsActivity.class);
                                intent.putExtra("uid", uID);
                                intent.putExtra("uname", uNAME);
                                intent.putExtra("uphone", uPHONE);
                                startActivity(intent);
                            }
                        });
                        holder.itemView.setOnClickListener(new View.OnClickListener() {
                            @Override
                            public void onClick(View view)
                            {
                                CharSequence options[] = new CharSequence[]
                                        {
                                                "Yes",
                                                "No"
                                        };
                                AlertDialog.Builder builder = new AlertDialog.Builder(AdminCategoryActivity.this);
                                builder.setTitle("Are you done with this case?");
                                builder.setItems(options, new DialogInterface.OnClickListener() {
                                    @Override
                                    public void onClick(DialogInterface dialogInterface, int i)
                                    {
                                        if(i ==0)
                                        {
                                            String uID = getRef(position).getKey();
                                            RemoveOrder(uID);
                                        }
                                        else
                                        {
                                            finish();
                                        }
                                        adminRef.removeValue()
                                                .addOnCompleteListener(new OnCompleteListener<Void>() {
                                                    @Override
                                                    public void onComplete(@NonNull Task<Void> task)
                                                    {
                                                        if(task.isSuccessful())
                                                        {
                                                            Toast.makeText(AdminCategoryActivity.this, "Item removed", Toast.LENGTH_SHORT).show();
                                                            finish();
                                                            startActivity(getIntent());
                                                        }
                                                    }
                                                });
                                    }
                                });
                                builder.show();
                            }
                        });
                    }

                    @NonNull
                    @Override
                    public AdminOrdersViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int i)
                    {
                        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.orders_layout, parent, false);
                        return new AdminOrdersViewHolder(view);
                    }
                };
        ordersList.setAdapter(adapter);
        adapter.startListening();
    }

    public static class AdminOrdersViewHolder extends RecyclerView.ViewHolder
    {
        public TextView userName, userPhoneNumber;
        public Button viewLocationBtn;
        public AdminOrdersViewHolder (View itemView)
        {
            super(itemView);
            userName = itemView.findViewById(R.id.userName);
            userPhoneNumber = itemView.findViewById(R.id.userPhoneNumber);
            viewLocationBtn = itemView.findViewById(R.id.viewLocationBtn);
        }
    }
    private void RemoveOrder(String uID)
    {
        adminRef.child(uID).removeValue();
    }
}

【问题讨论】:

标签: android firebase-realtime-database android-recyclerview firebaseui


【解决方案1】:
 FirebaseRecyclerAdapter<AdminOrders, AdminOrdersViewHolder> adapter;

在你的 onStart() 方法中:

adapter =new FirebaseRecyclerAdapter ....

在删除项目后调用 notifyItemRemoved(position) :

 private void RemoveOrder(String uID)
    {
        adminRef.child(uID).removeValue();

        adpater.notifyItemRemoved(position);
    }

或者如果您有更多更改(如更新、插入),您可以使用

notifyDataSetChanged()

adpater.notifyDataSetChanged()

【讨论】:

  • 我应该用什么代替 yourAdapter ?
  • 我不擅长java,所以我还在想办法编辑它:(
  • 我如你所说更改了行,但仍然无法解析此行中的适配器和位置 - ` adpater.notifyItemRemoved(position); `
  • FirebaseRecyclerAdapter&lt;AdminOrders, AdminOrdersViewHolder&gt; adapter; adapter = new FirebaseRecyclerAdapter&lt;AdminOrders, AdminOrdersViewHolder&gt;(options) 我如何更新它
【解决方案2】:

首先我必须说你的代码是正确的! 顺便说一句,这是您编辑的代码:

 package com.example.policeemergencysystem;

    import androidx.annotation.NonNull;
    import androidx.appcompat.app.AlertDialog;
    import androidx.appcompat.app.AppCompatActivity;
    import androidx.recyclerview.widget.LinearLayoutManager;
    import androidx.recyclerview.widget.RecyclerView;

    import android.content.DialogInterface;
    import android.content.Intent;
    import android.os.Bundle;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.Button;
    import android.widget.Switch;
    import android.widget.TextView;
    import android.widget.Toast;

    import com.example.policeemergencysystem.Model.AdminOrders;
    import com.firebase.ui.database.FirebaseRecyclerOptions;
    import com.google.android.gms.tasks.OnCompleteListener;
    import com.google.android.gms.tasks.Task;
    import com.google.firebase.database.DatabaseReference;
    import com.google.firebase.database.FirebaseDatabase;
    import com.firebase.ui.database.FirebaseRecyclerAdapter;

    public class AdminCategoryActivity extends AppCompatActivity {

        private RecyclerView ordersList;
        private DatabaseReference ordersRef, adminRef, mapRef;
        private Button backBtn;
        private String userID = "", userNAME = "", userPHONE = "";
        private FirebaseRecyclerAdapter<AdminOrders, AdminOrdersViewHolder> adapter;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_admin_category);

            userID = getIntent().getStringExtra("uid");
            userNAME = getIntent().getStringExtra("uname");
            userPHONE = getIntent().getStringExtra("uphone");
            ordersRef = FirebaseDatabase.getInstance().getReference().child("Users");
            adminRef = FirebaseDatabase.getInstance().getReference().child("Location");
            ordersList = findViewById(R.id.ordersList);
            ordersList.setLayoutManager(new LinearLayoutManager(this));
        }

        @Override
        protected void onStart()
        {
            super.onStart();
            FirebaseRecyclerOptions<AdminOrders> options =
                    new FirebaseRecyclerOptions.Builder<AdminOrders>()
                            .setQuery(ordersRef, AdminOrders.class)
                            .build();

           adapter  =
                    new FirebaseRecyclerAdapter<AdminOrders, AdminOrdersViewHolder>(options) {
                        @Override
                        protected void onBindViewHolder(@NonNull final AdminOrdersViewHolder holder, final int position, final @NonNull AdminOrders model)
                        {
                            holder.userName.setText("Name : "+ model.getName());
                            holder.userPhoneNumber.setText("Phone Number : "+ model.getPhone());
                            holder.viewLocationBtn.setOnClickListener(new View.OnClickListener() {
                                @Override
                                public void onClick(View v) {
                                    String uID = getRef(position).getKey();
                                    String uNAME = getRef(position).getKey();
                                    String uPHONE = getRef(position).getKey();
                                    Intent intent = new Intent(AdminCategoryActivity.this, AdminViewMapsActivity.class);
                                    intent.putExtra("uid", uID);
                                    intent.putExtra("uname", uNAME);
                                    intent.putExtra("uphone", uPHONE);
                                    startActivity(intent);
                                }
                            });
                            holder.itemView.setOnClickListener(new View.OnClickListener() {
                                @Override
                                public void onClick(View view)
                                {
                                    CharSequence options[] = new CharSequence[]
                                            {
                                                    "Yes",
                                                    "No"
                                            };
                                    AlertDialog.Builder builder = new AlertDialog.Builder(AdminCategoryActivity.this);
                                    builder.setTitle("Are you done with this case?");
                                    builder.setItems(options, new DialogInterface.OnClickListener() {
                                        @Override
                                        public void onClick(DialogInterface dialogInterface, int i)
                                        {
                                            if(i ==0)
                                            {
                                                String uID = getRef(position).getKey();
                                                RemoveOrder(uID);
                                            }
                                            else
                                            {
                                                finish();
                                            }
                                            adminRef.removeValue()     .addOnCompleteListener(newOnCompleteListener<Void>() {
                                                        @Override
                                                        public void onComplete(@NonNull Task<Void> task)
                                                        {
                                                            if(task.isSuccessful())
                                                            {
                                                                Toast.makeText(AdminCategoryActivity.this, "Item removed", Toast.LENGTH_SHORT).show();
                                                                finish();
                                                                startActivity(getIntent());
                                                            }
                                                        }
                                                    });
                                        }
                                    });
                                    builder.show();
                                }
                            });
                        }

                        @NonNull
                        @Override
                        public AdminOrdersViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int i)
                        {
                            View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.orders_layout, parent, false);
                            return new AdminOrdersViewHolder(view);
                        }
                    };
            ordersList.setAdapter(adapter);
            adapter.startListening();
        }

        public static class AdminOrdersViewHolder extends RecyclerView.ViewHolder
        {
            public TextView userName, userPhoneNumber;
            public Button viewLocationBtn;
            public AdminOrdersViewHolder (View itemView)
            {
                super(itemView);
                userName = itemView.findViewById(R.id.userName);
                userPhoneNumber = itemView.findViewById(R.id.userPhoneNumber);
                viewLocationBtn = itemView.findViewById(R.id.viewLocationBtn);
            }
        }

        private void RemoveOrder(String uID)
        {
            adminRef.child(uID).removeValue();
            adapter.notifyDataSetChanged();

        }
    }

【讨论】:

  • 该代码没有任何错误,但它不起作用。在 firebase 数据库中,它只删除仍然存在的名称和电话号码的位置。我不知道为什么:(
猜你喜欢
  • 2021-02-23
  • 2012-10-19
  • 2019-12-24
  • 2010-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-03
相关资源
最近更新 更多