如何在android中查询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"

我的firebase数据如下所示:

"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();}