2016-08-08 2 views
4

Недавно я начал переключать свое приложение с Parse на Firebase. Все до сих пор здорово, но я не смог найти эквивалентный метод Firebase для Parse's whereContainedIn (String key, Collection values).База данных Firebase - запрос по списку идентификаторов

Это был очень полезный метод, который позволил мне передать массив идентификаторов, и он вернет все строки, соответствующие этому id. До сих пор с Firebase я возвращал все строки в базе данных, а затем перебирал их, чтобы проверить, содержится ли идентификатор этой строки в моем массиве идентификаторов. Другой способ - запрашивать каждый идентификатор отдельно, что не работает с асинхронным поведением 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

Firebase не имеет 'WHERE ID IN (1,2,3)' эквивалент. Для списков требуемого размера, которые не нужны, поскольку запросы трубопроводов 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

Спасибо, но возможно ли вернуть объекты видео, а не только идентификаторы? Для этого все равно потребуется отдельный запрос для каждого видео. Моя цель - получить все объекты Video для конкретного пользователя с одним запросом. – Mark

+0

Вы можете сохранить видеообъект в обоих местах. Но было бы лучше просто сделать другой запрос. –

+0

Я не думаю, что это отвечает на исходный вопрос? – Atticus29

Смежные вопросы