首页 > 解决方案 > Firebase removeValue() 函数未删除正确的值

问题描述

我正在为我的应用程序添加编辑和删除功能。编辑功能工作正常,但我的删除功能并不总是删除正确的值。

删除功能无法按预期工作的场景:


这是我的数据库的结构:

供应商 >>>

=============> 自动生成的密钥(例如 -LpmoJ8DjCvF23I2ymVg)

==================================================== =====> 供应商名称

==================================================== =====> 供应商地址

==================================================== =====> 供应商_电话号码

==================================================== =====> 供应商_电子邮件


这是我的删除函数,它是一个 onClickListener,并使用 AlertDialog 进行确认:

btnMenuDelete.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                final AlertDialog.Builder builder = new AlertDialog.Builder(SupplierMaintenance.this);
                builder.setTitle("DELETE Supplier");
                builder.setMessage("You are about to delete the selected supplier. Continue?");
                builder.setCancelable(false);
                builder.setNegativeButton("Yes", new DialogInterface.OnClickListener() {

                    @Override
                    public void onClick(DialogInterface dialog, int which) {

                        //DELETE METHOD
                        databaseSupp = FirebaseDatabase.getInstance().getReference("SUPPLIERS");
                        final DatabaseReference mDatabase2 = databaseSupp;

                        mDatabase2.addValueEventListener(new ValueEventListener() {
                            @Override
                            public void onDataChange(@NonNull final DataSnapshot dataSnapshot2) {

                                for (final DataSnapshot snapshot : dataSnapshot2.getChildren()) {
                                    if (snapshot.child("Supplier_Name").getValue(String.class).equals(suppName.getText().toString())) {
                                        deletekey = snapshot.getKey().toString();
                                        keyholder.setText(deletekey);
                                    }
                                }
                            }
                            @Override
                            public void onCancelled(@NonNull DatabaseError databaseError) {

                            }
                        });

                        mDatabase2.child(keyholder.getText().toString()).removeValue();
                    }
                });

                builder.setPositiveButton("Cancel", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                    }
                });
                builder.show();
                //DELETE METHOD END
            }
        });

为了删除一个值,我获取了该项目的自动生成键,并将其用作删除该键的整个节点的参考。这在我的编辑功能中可以正常工作,但在我的删除功能中却不行。

我认为它与 onDataChange 有关系,但我不确定。

注意:这些项目位于recyclerView中,用户可以随时编辑或删除它们。

我尝试移动 onDatachange 方法,将 removeValue() 函数移动到不同的位置,并在使用它之前在 TextView 中设置键以确保它是正确的键,但由于某种原因它不能作为意,删除未选择的其他项目。

我已经被这个问题困扰了 3 天,因为我是这种编程的初学者,这是我的第一个完整的应用程序。

如果您需要更多代码,我可以根据需要发布尽可能多的代码。

任何帮助是极大的赞赏 :)。

标签: javaandroidfirebase

解决方案


我没有测试过代码,尝试掌握逻辑。欢迎任何疑问

btnMenuDelete.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            final AlertDialog.Builder builder = new AlertDialog.Builder(SupplierMaintenance.this);
            builder.setTitle("DELETE Supplier");
            builder.setMessage("You are about to delete the selected supplier. Continue?");
            builder.setCancelable(false);
            builder.setNegativeButton("Yes", new DialogInterface.OnClickListener() {

                @Override
                public void onClick(DialogInterface dialog, int which) {

                    //DELETE METHOD
                    databaseSupp = FirebaseDatabase.getInstance().getReference("SUPPLIERS");
                    final DatabaseReference mDatabase2 = databaseSupp;

                    mDatabase2.addListenerForSingleValueEvent(new ValueEventListener() {
                        @Override
                        public void onDataChange(@NonNull final DataSnapshot dataSnapshot2) {

                            for (final DataSnapshot snapshot : dataSnapshot2.getChildren()) {
                                if (snapshot.child("Supplier_Name").getValue(String.class).equals(suppName.getText().toString())) {
                                    deletekey = snapshot.getKey().toString();
                                    keyholder.setText(deletekey);
               mDatabase2.child(keyholder.getText().toString()).removeValue();  
                                     return;
                                }
                            }
                        }
                        @Override
                        public void onCancelled(@NonNull DatabaseError databaseError) {

                        }
                    });
                }
            });

            builder.setPositiveButton("Cancel", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                }
            });
            builder.show();
            //DELETE METHOD END
        }
    });

我希望供应商名称是唯一的


推荐阅读