如何从数据列表中获取键内子对象的值(使用Firebase中的childeventlistener:android studio)

时间:2018-11-20 04:18:27

标签: android firebase firebase-realtime-database

This is the Firebase JSON structure

好,所以我一直在寻找与此相关的文章,我做了一些实验,但我不明白为什么我仍然无法获得note,date_time和疫苗对象的值...我我计划将它们放到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提示“无法在child()中为参数'pathString'传递null”

1 个答案:

答案 0 :(得分:0)

您将引用设置为:

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)存储。