好,所以我一直在寻找与此相关的文章,我做了一些实验,但我不明白为什么我仍然无法获得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”
答案 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
)存储。