我需要查询 children of undetermined parents

I need to get a query of children of undetermined parents

我正在搜索栏中创建一个 SearchView 以过滤在特定日期内开始或结束的所有进程。

我需要查询进程和代码中的节点。

这是我的数据结构和我需要查询的内容:

我将其用于代码作为示例:

 //path of all posts
        DatabaseReference ref = FirebaseDatabase.getInstance().getReference("codes");
        //get all data from this ref

        ref.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot snapshot) {
                for (DataSnapshot ds: snapshot.getChildren()) {
                    String hola = Objects.requireNonNull(ds.getValue()).toString();
                    if (ds.hasChild("process")) {
                        for (DataSnapshot dsa: ds.getChildren()) {
                            System.out.println("result"+dsa);
                        /*    if (!isEmpty(Objects.requireNonNull(dsa.child("ended").getValue()).toString())) {
                                System.out.println("result: "+dsa.child("ended").getValue().toString());
                            }
*/
                        }


但是我需要获取其他children的节点,最好不改变数据结构:

我有一个加载所有内容的 FirebaseRecyclerOption,我只需要显示从 SearchView 过滤的持有人。

由于字符串中日期的格式,将无法在服务器端对数据进行筛选或排序。如果它被格式化为“yyyy.MM.dd a les HH:mm:ss”它仍然是可能的,因为它们是按数量级排列的,但这样安排我只能想象你读取所有节点并在本地重新排序列表(我认为这不是个好主意)。

我的建议是将此时间字段的格式替换为来自 firebase 本身的 TIMESTAMP 之类的服务器时间,或者如果它们是自定义时间,请转换它们并 re-store 它们。

如果这样做,您可以创建自定义过滤器并根据需要在服务器本身上对其进行排序,使用 orderByChild()、orderByKey()、orderByValue()、limitToFirst()、limitToLast()、startAt()、 startAfter()、endAt()、endBefore() 和 equalTo()。

如果您被允许更改数据库架构,存储数据的更方便的方法是采用如下所示的扁平化结构:

Firebase-root
   |
   --- codes
        |
        --- $pushedId
              |
              --- code: 17240
              |
              --- proces: "Cajones"
              |
              --- user: "Jose Anton"
              |
              --- started: longNumberForStarted
              |
              --- ended: longNumberForEnded

我推荐的东西:

  • 不要使用序号作为数据库中的键。使用由 push() 方法生成的唯一随机 ID。
  • 不要将日期存储为字符串,而是将它们存储为

这样,您就可以根据需要过滤结果。由于您使用的是时间戳,因此您可以根据需要使用 startAt() or endAt()