2017-10-02 2 views
0

Firebase에서 노드의 모든 자식을 포함해야하는 맵을 반환하는 메소드를 작성하려고하지만 콜백을 사용해야하므로이 메소드는 빈 맵을 반환합니다.Firebase 노드의 모든 자식을 Map으로 반환하는 메소드

public Map<Date, String> getChildrenAsMap(String nodeId) { 
    DatabaseReference refernce= dbRoot.child("childName").child(nodeId); 
    final Map<Date, String> childMap = new HashMap<>(); 

    refernce.addListenerForSingleValueEvent(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 

      Map<Date, String> data = (Map<Date, String>) dataSnapshot.getValue(); 

      for (Map.Entry<Date, String> entry : data.entrySet()) { 
       childMap .put(entry.getKey(), (String) entry.getValue()); 
      } 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 
      Log.w("TAG", "onCancelled", databaseError.toException()); 
     } 
    }); 
    return childMap; 
} 

답변

1

Firebase 쿼리가 비동기 적으로 발생하고 맵을 반환 한 후에 리스너가 호출되기 때문에 이런 상황이 발생합니다. 간단하게 유지하려면 ValueEventListener이 이미 정확히 수행하는 인터페이스이므로 비동기 메서드를 만들 수 없습니다. 이 같은 방법을 원한다면 당신은 당신을 위해 그것을 처리하는 클래스를 만들 필요가 거라고 작업,하지만 당신은 당신이 안드로이드에 대한 중포 기지에서 제공 원하는 모든 것을 가지고 있기 때문에이 필요 없습니다 :

DatabaseReference refernce= dbRoot.child("childName").child(nodeId); 

deviceHistory.addListenerForSingleValueEvent(new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot dataSnapshot) { 
     Map<Date, String> childMap = new HashMap<>(); 

     Map<Date, String> data = (Map<Date, String>) dataSnapshot.getValue(); 

     for (Map.Entry<Date, String> entry : data.entrySet()) { 
      childMap.put(entry.getKey(), (String) entry.getValue()); 
     } 

     // handle your childMap modifications in here, this gets executed after the value is retrieved 
    } 

    @Override 
    public void onCancelled(DatabaseError databaseError) { 
     Log.w("TAG", "onCancelled", databaseError.toException()); 
    } 
}); 

I을 비슷한 다른 주석을 썼습니다 (Swift의 경우에도 해당 지점이 아니지만 here). 당신은 당신이 그것을 사용할 때마다 로직을 ValueEventListener에 써야 할 것입니다. 이미 방법이기 때문에 새로 만들 필요가 없습니다.

0

이 문제를 해결하려면 데이터를 onDataChange() 밖으로 가져와야합니다. 내 대답은 post에서 확인하십시오.

이 반복 전에 호출되는 onDataChange()의 비동기 동작으로 인해 이러한 현상이 발생합니다.

+0

이것은 작동하지 않습니다. – creativecreatorormaybenot

+0

왜 그렇게 생각하니? –

+0

'childMap'이 범위를 벗어 났으며 return 문은 비동기 이벤트를 기다리지 않습니다. – creativecreatorormaybenot

관련 문제