2016-08-08 4 views
4

최근에 내 응용 프로그램을 구문 분석에서 Firebase로 전환하기 시작했습니다. 지금까지 모든 것이 훌륭해졌지만 Parse 's whereContainedIn (String key, Collection values)에 Firebase와 동일한 메소드를 찾을 수 없었습니다.Firebase 데이터베이스 - ID 목록 별 쿼리

이것은 ID 배열을 전달할 수있는 매우 유용한 방법이었으며 해당 ID와 일치하는 모든 행을 반환했습니다. 지금까지 Firebase를 사용하여 데이터베이스의 모든 행을 반환 한 다음 해당 행의 ID가 내 ID 배열에 포함되어 있는지 확인하기 위해 루핑했습니다. 다른 방법은 각 id를 개별적으로 쿼리하는 것이고, 이는 Firebase의 비동기 동작에는 적합하지 않습니다. 내 표는 수십만 개의 레코드를 포함하기 때문에

List<String> userIds = new ArrayList<>(); 
userIds.add("2"); 
userIds.add("32"); 
userIds.add("12545"); 
userIds.add("187"); 

DatabaseReference firebaseRef = FirebaseDatabase.getInstance().getReference(); 
Query queryRef = firebaseRef.child("videos"); 

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

     List<Video> usersVideos = new ArrayList<Video>(); 

     for (DataSnapshot videoSnapshot : dataSnapshot.getChildren()) { 
      Video video = videoSnapshot.getValue(Video.class); 

      if (userIds.contains(video.userId)) { 
       usersVideos.add(video); 
      } 
     } 

     // usersVideos is now populated with the videos for the users 

    } 

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

이러한 방법 중 어느 쪽이 합리적인 것 : 이것은 내가 첫 번째 방법 지금 뭐하는 거지입니다.

도움이 될 것입니다.

+1

중포 기지가 (1,2,3)'동등한 'WHERE ID를 가지고 있지 않습니다

그래서 참고로 더 같이 표시됩니다. Firebase가 파이프 라인 요청을하기 때문에 필요하지 않은 적당한 크기의 목록. http://stackoverflow.com/questions/35931526/speed-up-fetching-posts-for-my-social-network-app-by-using-query-instead-of-obse/35932786#35932786 –

답변

1

userId으로 조회 할 수있는 참조를 만들고이 사용자가 가지고있는 videoIds을 모두 반환해야합니다. 여기에서 동영상을 쿼리 할 수 ​​있습니다. 즉, 저장할 때마다 두 곳을 저장해야합니다. 일종의 고통이지만 Firebase가 권장하는 것입니다.

videos - 
     | - <videoId> - 
      | - <video stuffs> 
      | - userId 
videosByUser - 
     | - <userId> - 
        | 0 - <videoIdA> 
        | 1 - <videoIdB> 
     | - <userId2> - 
        | 0 - <videoIdA> 
+0

감사합니다. ids 대신 Video 객체를 반환 할 수 있습니까? 여전히 각 동영상에 대해 별도의 검색어가 필요합니다. 내 목표는 하나의 쿼리를 사용하여 특정 사용자에 대해 모든 Video 객체를 가져 오는 것입니다. – Mark

+0

비디오 개체를 두 위치에 모두 저장할 수 있습니다. 그러나 다른 쿼리를 만드는 것이 좋습니다. –

+0

이것이 원래의 질문에 대답하지 않는다고 생각합니까? – Atticus29