Как я могу удалить запись из базы данных в реальном времени, используя onSwipe в recyclerview

Я хочу удалить запись с помощью onSwipe, у меня есть этот код ниже, который работает для прокрутки, но не удаляется из firebase, когда я прокручиваю приложение, происходит сбой. см. мой код ниже и ошибку logcat.

    @Override
    public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {
        expenses.remove(viewHolder.getAdapterPosition());
        adapter.notifyDataSetChanged();

        DatabaseReference reference = FirebaseDatabase.getInstance().getReference().child("Expenses").child(FirebaseAuth.getInstance().getCurrentUser().getUid());
        reference.child(postId).removeValue().addOnCompleteListener(new OnCompleteListener<Void>() {
            @Override
            public void onComplete(@NonNull Task<Void> task) {
                if (task.isSuccessful()) {
                    Toast.makeText(ExpensesActivity.this, "Expenditure deleted!", Toast.LENGTH_SHORT).show();
                } else {
                    Toast.makeText(ExpensesActivity.this, "Something went wrong, try again" + task.getException(), Toast.LENGTH_SHORT).show();
                }
            }
        });

    }

Это сообщение logcat;

2022-03-21 14:44:23.365 22734-22734/com.delossantos.expensapp D/AndroidRuntime: Shutting down VM
2022-03-21 14:44:23.366 22734-22734/com.delossantos.expensapp E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.delossantos.expensapp, PID: 22734
    java.lang.NullPointerException: Can't pass null for argument 'pathString' in child()
        at com.google.firebase.database.DatabaseReference.child(DatabaseReference.java:96)
        at com.delossantos.expensapp.ExpensesActivity$6.onSwiped(ExpensesActivity.java:270)
        at androidx.recyclerview.widget.ItemTouchHelper$4.run(ItemTouchHelper.java:712)
        at android.os.Handler.handleCallback(Handler.java:938)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loopOnce(Looper.java:201)
        at android.os.Looper.loop(Looper.java:288)
        at android.app.ActivityThread.main(ActivityThread.java:7842)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003)

введите описание изображения здесь

Это говорит о том, что что-то, что требуется, является нулевым. Проверьте, получает ли ваш метод значения для postId в строке 6. Если да, у вас могут быть другие проблемы с тем, как вы получаете ссылку на коллекцию из firebase.

Estevao Santiago 21.03.2022 20:57

Похоже, ваша переменная postId равна null. Если предполагается, что это возможно, вы захотите проверить это в своем коде.

Frank van Puffelen 21.03.2022 21:23

Если вы когда-нибудь решите попробовать использовать Облако Firestore, я думаю, что эта статья, Как удалить запись из Firestore при пролистывании RecylerView влево/вправо? или Как удалить несколько записей из Firestore с помощью множественного выбора RecyclerView?, может помочь.

Alex Mamo 22.03.2022 07:42
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
3
42
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Похоже, ваш getUid() это null. Вы можете использовать приведенные ниже коды, чтобы проверить, вошел ли пользователь в систему или нет.

final FirebaseUser fUser = FirebaseAuth.getInstance().getCurrentUser();
if (fUser != null && postId != null) {
    final String userUid = fUser.getUid();
    DatabaseReference reference = FirebaseDatabase.getInstance().getReference().child("Expenses").child(userUid);
    reference.child(postId).removeValue().addOnCompleteListener(new OnCompleteListener<Void>() {
            @Override
            public void onComplete(@NonNull Task<Void> task) {
                if (task.isSuccessful()) {
                    Toast.makeText(ExpensesActivity.this, "Expenditure deleted!", Toast.LENGTH_SHORT).show();
                } else {
                    Toast.makeText(ExpensesActivity.this, "Something went wrong, try again" + task.getException(), Toast.LENGTH_SHORT).show();
                }
            }
        });
} else {
    //User is missing, do something
}

У меня нет проблем с текущим пользователем, проблема связана с идентификатором конкретного элемента, который я хочу удалить, каждый элемент сохраняется с идентификатором, мне нужно провести пальцем, чтобы узнать, что это идентификатор, который я хочу удалить, когда я прокручиваю элемент в recyclerview. Я только что добавил фотографию таблицы firebase, пожалуйста, проверьте.

Yeury De los Santos 21.03.2022 22:54

@YeuryDelosSantos Я думаю, что твой postId это null. Как сказал @Frank, вам нужно проверить, где вы берете свой postId, можете ли вы поделиться кодом для postId?

Ticherhaz FreePalestine 22.03.2022 01:13

Другие вопросы по теме