我最近开始将我的应用从Parse切换到Firebase。到目前为止,一切都很顺利,但我无法找到Firebase等效方法来解析其中whereContainedIn(String key,Collection values)。
这是一个非常有用的方法,它允许我传入一个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");
}
});
这些方法都不合理,因为我的表格将包含数十万条记录。
非常感谢任何帮助!
答案 0 :(得分:1)
制作另一个可以userId
查找的引用,并让它返回该用户拥有的所有videoIds
。从那里你可以查询视频。这意味着每次保存时,您需要保存两个位置。一种痛苦,但它是Firebase推荐的。
所以你的参考看起来更像是:
videos -
| - <videoId> -
| - <video stuffs>
| - userId
videosByUser -
| - <userId> -
| 0 - <videoIdA>
| 1 - <videoIdB>
| - <userId2> -
| 0 - <videoIdA>