FireBase removeValue () функция не удаляет правильное значение - PullRequest
0 голосов
/ 27 сентября 2019

Я работаю над добавлением функции редактирования и удаления в мое приложение.Функция редактирования работает нормально, но моя функция удаления не всегда удаляет правильное значение.

Сценарии, когда функция удаления работает не так, как задумано:

  • Когда я добавляюновый узел данных (новый поставщик в случае моего приложения.)

  • Когда я редактирую значение, последнее отредактированное значение удаляется вместо выбранного.

  • При запуске приложения удаление только одного из элементов приводит к удалению всего «ПОСТАВЩИКА».

  • При необходимости дважды нажать кнопку удаления, чтобы удалить элемент.


Это структура моей базы данных:

ПОСТАВЩИКИ >>>

=============> автоматически генерируемый ключ (например, -LpmoJ8DjCvF23I2ymVg)

==============================================================> Имя_поставщика

=======================================================> Адрес_поставщика

=============================================================> Supplier_PhoneNum

=======================================================> Supplier_Email


Вот моя функция удаления, это 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 дня, так как я новичок в этом виде программирования, и это мое первое полнофункциональное приложение.

Если вам нужен больше код, я могу выложить столько, сколько нужно.

Любая помощь очень ценится:).

1 Ответ

1 голос
/ 27 сентября 2019

Я не проверял код, попробуйте понять логику.Любые сомнения приветствуются

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
        }
    });

Я надеюсь, что имя_поставщика уникально

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...