如何根据Firebase中孩子的属性查询列表?

时间:2017-01-29 09:56:11

标签: android firebase firebase-realtime-database nosql

我自己做了一个爱好应用程序,所以我可以尝试使用Firebase。该应用程序的想法是将youtube链接添加到播放列表,然后由远程客户端播放。我的数据看起来像这样:

 "songs" : {
  "4sRxtvygyDo" : {
    "playStatus" : 2,
    "songtitle" : "Silent Alarm - Bloc Party (Full Album, High Quality)",
    "thumbnail" : "https://i.ytimg.com/vi/4sRxtvygyDo/default.jpg",
    "youtubeurl" : "https://www.youtube.com/watch?v=4sRxtvygyDo"
  },
  "ht-nFq3DjP0" : {
    "playStatus" : 2,
    "songtitle" : "We Were Promised Jetpacks: These Four Walls (Full Album)",
    "thumbnail" : "https://i.ytimg.com/vi/ht-nFq3DjP0/default.jpg",
    "youtubeurl" : "https://www.youtube.com/watch?v=ht-nFq3DjP0"
  },
  "xFWVFu2ASbE" : {
    "playStatus" : 0,
    "songaddedtime" : 1485642448454,
    "songtitle" : "Totorro - Home Alone [Full Album]",
    "thumbnail" : "https://i.ytimg.com/vi/xFWVFu2ASbE/default.jpg",
    "youtubeurl" : "https://www.youtube.com/watch?v=xFWVFu2ASbE"
  }
}

每首歌的ID都是根据YouTube的视频ID生成的,其播放状态如下:

  • 0 =待定
  • 1 =正在播放
  • 2 =播放

因为客户想要了解添加到播放列表中的新歌,所以它会让听众保持这个列表,并且每次更新都会过滤所有播放状态为0的歌曲,如下所示:

playlistReference.addValueEventListener(new ValueEventListener() {

    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for (DataSnapshot song : dataSnapshot.getChildren()) {
            if (song.child("playStatus").getValue(Integer.class) == 0) {
                songPlayer.playNext(song.getKey());
                break;
            }
        }
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {
    }
});

然而,这是非常低效的,因为监听器将接收有关播放列表中任何项目的任何更改的通知 - 根据使用情况,这可能会变得非常大。那么有没有办法让我的应用程序只收到播放状态值设置为0的歌曲的更改通知?

我检查了documentation,我也找到了this old blog article that promised more powerful queries as an upcoming feature,但我还没有办法做到这一点。

1 个答案:

答案 0 :(得分:3)

您使用:

playlistReference.orderByChild("playStatus").equalTo(0).add...

Firebase documentation on queries

中介绍了这一点

不要忘记add an index to your Firebase rules,以便在服务器端执行查询:

{
  "rules": {
    "songs": {
      ".indexOn": "playStatus"
    }
  }
}