【问题标题】:how can i point to the random key( firebase user ID)我如何指向随机密钥(firebase 用户 ID)
【发布时间】:2020-01-12 22:32:46
【问题描述】:

我想根据创建日期和时间从Firebase检索数据 我还没有找到任何其他方法,而不是创建每个用户的孩子来使用orderByChild("Create") 保存创建日期和时间排序,但每个用户都保存有随机 id 我如何指向按孩子排序:

DatabaseReference userref = FirebaseDatabase.getInstance().getReference().child("Connection").child("Admin");
        userref.orderByChild("Create");

        userref.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                if (dataSnapshot.exists()) {
                    for (DataSnapshot userSnapshot : dataSnapshot.getChildren()) {

                        Users users = userSnapshot.getValue(Users.class);
                        adminsList.add(users);

                    }
                    mAdapter = new Adapter_All_Admins(adminsList);
                    mRecyclerView.addItemDecoration(new DividerItemDecoration(getContext(), LinearLayoutManager.VERTICAL));
                    mRecyclerView.setAdapter(mAdapter);


                }

            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });


【问题讨论】:

  • 通过阅读您的问题,我真的很难理解您的确切问题。我无法弄清楚你的最终目标是什么?您的预期和当前输出是什么?你为什么关心随机密钥?你是什​​么意思,“我怎么能指向排序的孩子”?最后,正如您已经知道的,通过使用 orderByChild("Create") 可以对其进行排序,那么问题是什么?
  • 实际上 orderByChild("Create") 将订购 userref,因为 userref 指的是“Admin”,但在 Admin 中没有像“Create”这样的子项,它是包含我想要的用户数据的随机密钥的子项以引用随机密钥的方式,以便 orderByChild("Create") 可以工作
  • @Roaim 立即查看

标签: java android firebase firebase-realtime-database


【解决方案1】:

您的代码中不止一个问题。

我还没有找到任何其他方法,而不是使用 orderByChild("Create") 创建每个用户的孩子来保存创建日期和时间排序

这是为每个用户创建单独节点的推荐方法。第一个问题是 Firebase 实时数据库查询是不可变的,这意味着您无法更改现有查询的属性。如果您通过调用.orderByChild("Create") 方法更改值,它将成为一个新查询。这与 String 类的行为完全相同。因此,为了解决这个问题,请将所有方法调用链接起来,并将它们存储在一个 Query 对象中:

Query userref = FirebaseDatabase.getInstance().getReference()
    .child("Connection")
    .child("Admin")
    .orderByChild("Create");

或者您可以像这样创建一个新的Query 对象:

Query createQuery = userref.orderByChild("Create");
createQuery.addValueEventListener(/* ... */);

第二个问题,要得到相关结果,请注意时间戳不能存储为String:

创建:“2019/09/11 02.32:54”

因为这种情况下的顺序是lexicographically。因此,您绝对应该将它们存储为 ServerValue.TIMESTAMP,正如我在以下帖子中的回答中所解释的那样:

第三个问题是数据库中的属性以大写字母开头。如果您的 Users 类中的字段是小写的,或者即使以大写字母开头,您也可能会收到以下错误:

W/ClassMapper:在类用户上找不到 Create 的设置器/字段

要解决这个问题,您应该使用以下帖子中的答案:

或来自以下帖子:

编辑:

查询时,不需要将uid0yozyNJzCvTWtRU8ufe5Zx8TPvu1添加为child。您应该只获得对Admin 的引用,然后遍历子项(实际上是用户对象)。当您调用 .orderByChild("Create") 时,您正在将 DatabaseReference 对象转换为 Query 对象,并且您正在根据 Create 属性对所有用户进行排序。

只有当你想获得一个特定的用户对象时,你才应该添加对child("0yozyNJzCvTWtRU8ufe5Zx8TPvu1")的显式调用,否则你不需要这样做。

或者你是 .orderByChild() 也可以为子孩子工作??

是的,它会起作用的。试一试;)

【讨论】:

  • 但在这里 .child("Admin") .orderByChild("Create");没有孩子作为“创建”它是“管理员”的子孩子在“管理员”和“创建”之间有一个随机密钥使用我可以说 '.child("Admin").child("0yozyNJzCvTWtRU8ufe5Zx8TPvu1") 。 orderByChild("创建"); '但我没有检索单个密钥的数据,所以我可以使用这个我可以使用的东西来代替这个随机密钥,这样我就可以根据每个随机密钥中的“创建”对所有数据进行排序,,,,或者你' re .orderByChild() 也可以为子孩子工作??
  • 它工作得很好,如果用户是在 2019 年创建的,第二个是在 2020 年创建的,2020 年的用户应该在底部,2019 年的用户应该在顶部,那么你能帮我按升序或降序对它进行实时排序
  • 这个问题和最初的问题无关。因此,为了遵守这个社区的规则,请发布另一个新问题,以便我和其他 Firebase 开发人员可以帮助您。
  • 我认为没有人能更好地处理 firbase 问题,然后请看这里 [这是我的问题](stackoverflow.com/questions/57912265/…)
猜你喜欢
  • 2017-02-10
  • 2021-04-11
  • 1970-01-01
  • 1970-01-01
  • 2021-11-01
  • 2017-06-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多