Как получить значение дочернего объекта внутри ключа из списка данных (используя childeventlistener в firebase: android studio) - PullRequest
0 голосов
/ 20 ноября 2018

This is the Firebase JSON structure

Хорошо, поэтому я искал соответствующие статьи по этому поводу, я провел несколько экспериментов, но я не могу понять, почему я до сих пор не могу получить значения объектов note, date_time и прививки ... I ' Я планирую поместить их в ListView, и я уже получил ключ из списка данных, используя ChildEventListener

 lastlastref = myRef.child(babyid).child("baby_features").child("immunization_records");

    lastlastref.addChildEventListener(new ChildEventListener() {
        @Override
        public void onChildAdded(DataSnapshot dataSnapshot, String s) {
            String string = dataSnapshot.getValue(String.class);


        }

        @Override
        public void onChildChanged(DataSnapshot dataSnapshot, String s) {

        }

        @Override
        public void onChildRemoved(DataSnapshot dataSnapshot) {

        }

        @Override
        public void onChildMoved(DataSnapshot dataSnapshot, String s) {

        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });

и затем я попытался использовать EventListener, чтобы получить значения внутри него

 lastlastref = myRef.child(babyid).child("baby_features").child("immunization_records");

    lastlastref.addChildEventListener(new ChildEventListener() {
        @Override
        public void onChildAdded(DataSnapshot dataSnapshot, String s) {
            String string = dataSnapshot.getValue(String.class);

            DatabaseReference newRef = lastlastref.child(string);

            newRef.addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot snapshot) {
                    note = snapshot.child("note").getValue(String.class);
                    vaccine = snapshot.child("vaccine").getValue(String.class);
                    timestamp = snapshot.child("date_time").getValue(String.class);

                }
                @Override
                public void onCancelled(DatabaseError databaseError) {
                }
            });
             arrayList.add(vaccine + "" +  timestamp + "" + note);
             adapter.notifyDataSetChanged();

        }

        @Override
        public void onChildChanged(DataSnapshot dataSnapshot, String s) {

        }

        @Override
        public void onChildRemoved(DataSnapshot dataSnapshot) {

        }

        @Override
        public void onChildMoved(DataSnapshot dataSnapshot, String s) {

        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });

Но приложение по-прежнему аварийно завершает работу, и logcat говорит: «Невозможно передать значение NULL для аргумента pathString в child ()»

1 Ответ

0 голосов
/ 20 ноября 2018

Вы установили свою ссылку на:

lastlastref = myRef.child(babyid).child("baby_features").child("immunization_records");

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

{
  "date_time": "November/16/2018...",
  "note": "hhjj...",
  "vaccine": "Measles"
}

Но в вашем onChildAdded вы пытаетесь получить одно строковое значение. Поскольку вышеупомянутый объект JSON не является строковым значением, getValue(String.class) возвращает null.

Чтобы получить значения, вы можете вызвать getValue() для отдельных свойств:

lastlastref.addChildEventListener(new ChildEventListener() {
    @Override
    public void onChildAdded(DataSnapshot dataSnapshot, String s) {
        String date_time = dataSnapshot.child("date_time").getValue(String.class);
        String note = dataSnapshot.child("note").getValue(String.class);
        String vaccine = dataSnapshot.child("vaccine").getValue(String.class);
    }

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

public class ImmunizationRecord {
  public String date_time;
  public String note;
  public String vaccine;
}

И тогда чтение будет сделано с:

public void onChildAdded(DataSnapshot dataSnapshot, String s) {
    String record = dataSnapshot.getValue(ImmunizationRecord.class);
}

Небольшая заметка о том, как вы храните date_time. Этот формат будет вызывать проблемы по мере вашего продвижения, так как он не сортируется. Если вам нужно хранить метки времени, храните их в миллисекундах с начала эпохи или в строковом формате, который позволяет их сортировать (например, 2018-11-16T11:29:00).

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