почему postSnapshot выглядит нулевым - PullRequest
1 голос
/ 11 апреля 2020

Я пытаюсь создать / обновить данные тревоги в базе данных Firebase в реальном времени.

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

У меня есть метод setClock и я пытаюсь контролировать, существуют ли данные, поэтому я пишу новый метод ( findAlarm), но я получил ошибку ссылки на нулевой объект.

Я использовал Log.e для контроля того, что он нулевой или нет, но он выглядит заполненным.

Я не понимаю, что такое мой неисправность. помогите пожалуйста

public  void setClock( int hour,  int minute){
        Alarm alm=findAlarm();
        if(alm==null){
            String pushkey= databaseReference.push().getKey();
            Log.e("push",pushkey);
            Alarm alarm = new Alarm(hour,minute,firebaseUser.getUid(),pushkey);
            databaseReference.child(pushkey).setValue(alarm);
        }
        else{
            alm.setHour(hour);
            alm.setMin(minute);
            databaseReference.child(alm.getPushKey()).setValue(alm);
        }





    }
    public Alarm findAlarm(){
        final Alarm alarm2 = null;

        databaseReference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {


                for (DataSnapshot postSnapshot : dataSnapshot.getChildren()) {
                    Log.e("hour", String.valueOf(postSnapshot.child("hour").getValue(int.class)));
                    Log.e("userid",postSnapshot.child("user").getValue(String.class));
                    Log.e("userid2",firebaseUser.getUid());


                    if(postSnapshot.child("user").getValue(String.class).equals(firebaseUser.getUid())) {
                        alarm2.setHour(postSnapshot.child("hour").getValue(int.class));
                        alarm2.setMin(postSnapshot.child("min").getValue(int.class));
                        alarm2.setPushKey(postSnapshot.child("pushKey").getValue(String.class));
                        alarm2.setUser(postSnapshot.child("user").getValue(String.class));
                    }
                }



            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });

        return alarm2;
    }

Logcat

E/hour: 23
E/userid: E3CFesWWcrM7WAJCPwDENbQCk2i2
E/userid2: E3CFesWWcrM7WAJCPwDENbQCk2i2
D/AndroidRuntime: Shutting down VM
E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.sozluk, PID: 7185
    java.lang.NullPointerException: Attempt to invoke virtual method 'void com.example.sozluk.Alarm.setHour(int)' on a null object reference
        at com.example.sozluk.Scroll$2.onDataChange(Scroll.java:111)

1 Ответ

0 голосов
/ 11 апреля 2020

alarm2 изначально равно нулю, потому что вы установили его следующим образом:

final Alarm alarm2 = null;

И вы никогда не давали ему новое значение, поэтому оно остается нулевым при выполнении этой строки, что приводит к сбою приложения:

alarm2.setHour(postSnapshot.child("hour").getValue(int.class));

Вам нужно будет дать ему значение перед вызовом методов для него. К сожалению, вы не можете, потому что вы сделали это final, чтобы вы могли использовать его внутри обратного вызова базы данных.

Чтобы правильно работать с Firebase, вам нужно научиться работать с его API-интерфейсами асинхронно , как они предназначены. Запросы не возвращаются сразу. Ваш слушатель будет вызван через некоторое время после завершения запроса. Вы можете использовать только данные из снимка в слушателе.

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