Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 从firebase中的一个键获取整个值_Android_Firebase_Firebase Realtime Database - Fatal编程技术网

Android 从firebase中的一个键获取整个值

Android 从firebase中的一个键获取整个值,android,firebase,firebase-realtime-database,Android,Firebase,Firebase Realtime Database,我想从目的地得到整个值(0~5) 这是实时数据库中json数据的一部分 {"results" : [{ "destin_num" : 6, "destinations" : [ "asdf", "qwwee", "zzzxcv11", "jkkk", "lkjhhg", "zxcvb" ], "name" : "asdfasdfff", "order" : 2, "required_time" : "6hours" }]} 要放入字符串列表中的值,我使用ChildEventListener(

我想从目的地得到整个值(0~5)

这是实时数据库中json数据的一部分

{"results" : [{
"destin_num" : 6,
"destinations" : [ "asdf", "qwwee", "zzzxcv11", "jkkk", "lkjhhg", "zxcvb" ],
"name" : "asdfasdfff",
"order" : 2,
"required_time" : "6hours"  }]}
要放入字符串列表中的值,我使用ChildEventListener()将值添加到列表中,但在完成ChildEventListener()后无法将值放入列表中。列表方向将没有任何内容如何获取值

List<String> direction=new ArrayList<String>();

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_maps);
    // Obtain the SupportMapFragment and get notified when the map is ready to be used.
    SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);
    mapFragment.getMapAsync(this);

    DatabaseReference reference_contacts = FirebaseDatabase.getInstance().getReference("results").child("1").child("destinations");

   reference_contacts.addChildEventListener(new ChildEventListener() {
      @Override

      public void onChildAdded(DataSnapshot dataSnapshot, String s) {
          String data=dataSnapshot.getValue().toString();
          direction.add(data);
      }

      @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) {

      }
      });


    for(int i=0;i<direction.size();i++){
        Log.e("Get data",direction.get(i));
    }

}
List direction=new ArrayList();
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_映射);
//获取SupportMapFragment,并在地图准备好使用时收到通知。
SupportMapFragment mapFragment=(SupportMapFragment)getSupportFragmentManager().findFragmentById(R.id.map);
getMapAsync(这个);
DatabaseReference_contacts=FirebaseDatabase.getInstance().getReference(“结果”).child(“1”).child(“目的地”);
引用\u contacts.addChildEventListener(新的ChildEventListener(){
@凌驾
公共void onChildAdded(DataSnapshot DataSnapshot,字符串s){
字符串数据=dataSnapshot.getValue().toString();
方向。添加(数据);
}
@凌驾
公共void onChildChanged(DataSnapshot DataSnapshot,字符串s){
}
@凌驾
ChildRemoved上的公共void(DataSnapshot DataSnapshot){
}
@凌驾
已移动ChildMoved上的公共void(DataSnapshot DataSnapshot,字符串s){
}
@凌驾
已取消的公共void(DatabaseError DatabaseError){
}
});

for(int i=0;i这是因为数据是从Firebase异步加载的。实际上,在调用
onchildaded
之前,您的
for
循环打印值。通过添加一些日志记录,最容易看到这一点:

Log.i("Firebase", "Before adding listener");
reference_contacts.addChildEventListener(new ChildEventListener() {
  @Override

  public void onChildAdded(DataSnapshot dataSnapshot, String s) {
    Log.i("Firebase", "In onChildAdded");
  }

  @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) {
    throw databaseError.toException(); // don't ignore errors
  }
});
Log.i("Firebase", "After adding listener");
运行此代码时,它会打印:

在添加侦听器之前

添加侦听器后

一心一意

这可能不是您期望的顺序。但这完全解释了为什么打印时
方向
列表为空,数据尚未加载,因此从未调用
onchildaded

解决方案通常是将需要数据的代码添加到
onchildaded
方法中:

因此:

如果只想在加载所有内容后显示数据,可以使用
ValueEventListener

reference_contacts.addValueEventListener(new ValueEventListener() {
  @Override

  public void onDataChange(DataSnapshot snapshot) {
    for (DataSnapshot dataSnapshot: snapshot.getChildren()) {
      String data=dataSnapshot.getValue(String.class);
      direction.add(data);
    }
    for(int i=0;i<direction.size();i++){
      Log.e("Get data",direction.get(i));
    }
  }
  @Override
  public void onCancelled(DatabaseError databaseError) {
    throw databaseError.toException(); // don't ignore errors
  }
});
reference\u contacts.addValueEventListener(新的ValueEventListener(){
@凌驾
公共无效onDataChange(数据快照快照){
对于(DataSnapshot DataSnapshot:snapshot.getChildren()){
String data=dataSnapshot.getValue(String.class);
方向。添加(数据);
}

对于(int i=0;我支持您):
reference_contacts.addValueEventListener(new ValueEventListener() {
  @Override

  public void onDataChange(DataSnapshot snapshot) {
    for (DataSnapshot dataSnapshot: snapshot.getChildren()) {
      String data=dataSnapshot.getValue(String.class);
      direction.add(data);
    }
    for(int i=0;i<direction.size();i++){
      Log.e("Get data",direction.get(i));
    }
  }
  @Override
  public void onCancelled(DatabaseError databaseError) {
    throw databaseError.toException(); // don't ignore errors
  }
});