我自己做了一个爱好应用程序,所以我可以尝试使用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的歌曲,如下所示:
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,但我还没有办法做到这一点。
答案 0 :(得分:3)
您使用:
playlistReference.orderByChild("playStatus").equalTo(0).add...
Firebase documentation on queries。
中介绍了这一点不要忘记add an index to your Firebase rules,以便在服务器端执行查询:
{
"rules": {
"songs": {
".indexOn": "playStatus"
}
}
}