删除并更新在android studio、Java和firebase中按ID搜索的项目

删除并更新在android studio、Java和firebase中按ID搜索的项目,java,android,firebase,firebase-realtime-database,Java,Android,Firebase,Firebase Realtime Database,我用Java实现了代码,通过使用ID进行搜索并在表单中显示,从Firebase数据库检索数据。如果我添加id,它将正确显示数据 已成功检索数据 firebase中的数据 但当我试图删除或更新此数据时,它总是显示为“无数据资源”。我试图实现代码,但它不起作用。如何删除和更新特定数据(按ID搜索) 我试过的全部代码 public class MainActivity extends AppCompatActivity { EditText txtID,txtName,txtAdd,tx

我用Java实现了代码,通过使用ID进行搜索并在表单中显示,从Firebase数据库检索数据。如果我添加id,它将正确显示数据

已成功检索数据

firebase中的数据

但当我试图删除或更新此数据时,它总是显示为“无数据资源”。我试图实现代码,但它不起作用。如何删除和更新特定数据(按ID搜索)

我试过的全部代码

public class MainActivity extends AppCompatActivity {

    EditText txtID,txtName,txtAdd,txtConNo,txtid;
    Button btnSave,btnShow,btnUpdate,btnDelete;
    DatabaseReference dbRef;
    Student std;

    String searchID;

    private void clearControls(){
        txtID.setText("");
        txtName.setText("");
        txtAdd.setText("");
        txtConNo.setText("");
        txtid.setText("");
    }


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

        txtID = findViewById(R.id.EtID);
        txtName = findViewById(R.id.EtName);
        txtAdd = findViewById(R.id.EtAddress);
        txtConNo = findViewById(R.id.EtConNo);
        txtid = findViewById(R.id.search);


        btnSave = findViewById(R.id.BtnSave);
        btnShow = findViewById(R.id.BtnShow);
        btnUpdate = findViewById(R.id.BtnUpdate);
        btnDelete = findViewById(R.id.BtnDelete);

        std = new Student();


    }

    protected void onResume(){
        super.onResume();

        btnSave.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                dbRef = FirebaseDatabase.getInstance().getReference().child("Student");
                try{
                    if(TextUtils.isEmpty(txtID.getText().toString()))
                        Toast.makeText(getApplicationContext(),"Please enter an ID",Toast.LENGTH_SHORT).show();
                    else if(TextUtils.isEmpty(txtName.getText().toString()))
                        Toast.makeText(getApplicationContext(),"Please enter a Name",Toast.LENGTH_SHORT).show();
                    else if (TextUtils.isEmpty(txtAdd.getText().toString()))
                        Toast.makeText(getApplicationContext(),"Please enter an Address",Toast.LENGTH_SHORT).show();

                    else {
                        std.setID(txtID.getText().toString().trim());
                        std.setName(txtName.getText().toString().trim());
                        std.setAddress(txtAdd.getText().toString().trim());
                        std.setConNo(txtConNo.getText().toString().trim());

                        dbRef.push().setValue(std);

                        Toast.makeText(getApplicationContext(),"Data Saved Successfully",Toast.LENGTH_SHORT).show();
                        clearControls();
                    }
                }
                catch (NumberFormatException e){
                    Toast.makeText(getApplicationContext(),"Invalid Contact Number",Toast.LENGTH_SHORT).show();

                }
            }
        });

        btnShow.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                searchID = txtid.getText().toString().trim();
                DatabaseReference readRef = FirebaseDatabase.getInstance().getReference();
                DatabaseReference dref = readRef.child("Student");
                Query query = dref.orderByChild("id").equalTo(searchID);
                query.addListenerForSingleValueEvent(new ValueEventListener() {
                    @Override
                    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                        if(dataSnapshot.exists()) {
                            for (DataSnapshot ds : dataSnapshot.getChildren()) {
                                txtID.setText((ds.child("id").getValue().toString()));
                                txtName.setText((ds.child("name").getValue().toString()));
                                txtAdd.setText((ds.child("address").getValue().toString()));
                                txtConNo.setText((ds.child("conNo").getValue().toString()));
                            }
                        }
                        else
                            Toast.makeText(getApplicationContext(),"No Source to Display",Toast.LENGTH_SHORT).show();

                    }

                    @Override
                    public void onCancelled(@NonNull DatabaseError databaseError) {
                        Log.d("TAG", databaseError.getMessage()); //Don't ignore potential errors!
                    }
                });
            }
        });

        btnUpdate.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                DatabaseReference updf = FirebaseDatabase.getInstance().getReference().child("Student");
                updf.addListenerForSingleValueEvent(new ValueEventListener() {
                    @Override
                    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                        if(dataSnapshot.hasChild("Student")){
                            try{
                                std.setID(txtID.getText().toString().trim());
                                std.setName(txtName.getText().toString().trim());
                                std.setAddress(txtAdd.getText().toString().trim());
                                std.setConNo(txtConNo.getText().toString().trim());
                                dbRef = FirebaseDatabase.getInstance().getReference().child("Student");
                                dbRef.setValue(std);
                                clearControls();

                                Toast.makeText(getApplicationContext(),"Data updated successfully",Toast.LENGTH_SHORT).show();
                            }catch(NumberFormatException e){
                                Toast.makeText(getApplicationContext(),"Invalid data",Toast.LENGTH_SHORT).show();
                            }

                        }else
                            Toast.makeText(getApplicationContext(),"Nothing to show",Toast.LENGTH_SHORT).show();
                    }

                    @Override
                    public void onCancelled(@NonNull DatabaseError databaseError) {
                        Log.d("TAG", databaseError.getMessage());
                    }
                });
            }
        });

        btnDelete.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                DatabaseReference deldf = FirebaseDatabase.getInstance().getReference().child("Student");
                deldf.addListenerForSingleValueEvent(new ValueEventListener() {
                    @Override
                    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                        if(dataSnapshot.hasChild("Student")){
                                dbRef = FirebaseDatabase.getInstance().getReference().child("Student");
                                dbRef.removeValue();
                                clearControls();

                                Toast.makeText(getApplicationContext(),"Data Deleted successfully",Toast.LENGTH_SHORT).show();


                        }else
                            Toast.makeText(getApplicationContext(),"Nothing to show",Toast.LENGTH_SHORT).show();
                    }

                    @Override
                    public void onCancelled(@NonNull DatabaseError databaseError) {
                        Log.d("TAG", databaseError.getMessage());
                    }
                });

            }
        });

    }

}

要删除带有
ID001
的元素,请使用以下代码行:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference studentRef = rootRef.child("Student");
Query queryById = studentRef.orderByChild("id").equalTo(idToBeRemoved);
ValueEventListener valueEventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for(DataSnapshot ds : dataSnapshot.getChildren()) {
            ds.getRef().removeValue();
        }
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
        Log.d("TAG", databaseError.getMessage()); //Don't ignore potential errors!
    }
};
studentRef.addListenerForSingleValueEvent(valueEventListener);

上述代码的结果将是删除具有
ID001
的元素。如果需要更新相同的元素,只需使用
updateChildren()

我不想指定id。我希望用户通过id进行搜索并从数据库中检索数据。然后用户可以更新和删除他搜索的id的详细信息。它可以是数据库中的任何id。在这种情况下,我用
idToBeRemoved
更改了
ID001
的硬编码值,这个变量可以获得用户正在键入的确切值,对吗?是的,先生。如果将类型id用作“ID002”,则需要更新和删除该特定数据。确切地说,
idToBeRemoved=textView.getText().toString()
,对吗?query.addListenerForSingleValueEvent(新值EventListener(){@Override public void onDataChange(@NonNull DataSnapshot DataSnapshot){for(DataSnapshot ds:DataSnapshot.getChildren()){HashMap map=newhashmap();map.put(“id”,txtID);ds.getRef().updateChildren(map);clearControls();}}尝试像这样实现,但不起作用