如何在android中查询firebase数据?
我的firebase数据如下所示:如何在android中查询firebase数据?,android,firebase,firebase-realtime-database,Android,Firebase,Firebase Realtime Database,我的firebase数据如下所示: "worldwide" : [{ "key1" : { "movie_id": 100, "release_date": 1524182400000, "description": "Cool movie here" }, "key2" : { "movie_id": 101, "release_date": 1525046400000, "description": "Plot is cool"
"worldwide" : [{
"key1" : {
"movie_id": 100,
"release_date": 1524182400000,
"description": "Cool movie here"
},
"key2" : {
"movie_id": 101,
"release_date": 1525046400000,
"description": "Plot is cool"
}
}]
"europe" : [{
"key1" : {
"movie_id": 100,
"release_date": 1516798528489,
"description": "Cool movie here"
},
"key3" : {
"movie_id": 102,
"release_date": 1525046400000,
"description": "Cool plot"
}
}]
注意:这两个列表都在一个名为releases的man列表中
在过去的几个小时里,我一直在尝试用java/android查询我的数据,以便两个列表中的数据结合在一起,形成一个完整的列表,其中包含按发行日期(以毫秒为单位)排序的电影,对于重复条目,我希望欧洲数组中的发行日期信息优先,因此,如果电影id同时在两个列表中,并且在worldwide数组和Europe数组中的发布日期不同,我希望Europe数组中的条目保存在完整列表中。例如,“movie_id”:100出现在两个列表中。多谢各位
我的java代码:
DatabaseReference reference = FirebaseDatabase.getInstance().getReference();
Query query = null; // I don't know how to structure my query
query.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if (dataSnapshot.exists()) {
for (DataSnapshot movie: dataSnapshot.getChildren()) {
}
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
任何提示都将不胜感激,就像我想听听是否有更好的方法来完成我想要的 首先,您需要确保您的数据库具有
.indexOn
。这将确保您可以查询/排序数据
接下来,您可以将查询添加到数据库引用:
firebase::database::Query query =
reference.GetReference("worldwide").OrderByChild("release_date");
最后,阅读文档中的
要合并这两个列表,只需运行两个查询并将电影添加到并发列表中。然后对列表进行排序。Firebase中没有通过一个查询从两个列表读取数据的结构。这意味着您必须:
- 使用两个侦听器(一个在
上,另一个在全球
上)并在客户端合并来自这些侦听器的结果欧洲
- 或者在上面的节点
和worldwide
上使用一个侦听器,然后迭代生成的快照europe
ref.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot movie: dataSnapshot.getChild("europe").getChildren()) {
System.out.println(movie.getKey()+": "+movie.getChild("movie_id").getValue());
}
for (DataSnapshot movie: dataSnapshot.getChild("worldwide").getChildren()) {
System.out.println(movie.getKey()+": "+movie.getChild("movie_id").getValue());
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
throw new databaseError.toException();
}
});
我只是有个奇怪的想法。。如果两个列表都已排序,则分别存储列表,然后运行合并排序(到队列中)。因此,我必须在java中加入这两个列表?如果您的键是唯一的,则可以将这两个列表合并到另一个主/合并列表中。通常,Firebase数据库结构非常扁平,重复数据不是问题。您可以创建一个云函数,自动将新的子级传播到主/合并中。第一步是停止忽略潜在的错误:
public void onCancelled(DatabaseError DatabaseError){throw DatabaseError.toException();}