我如何指向随机密钥(firebase用户ID)

时间:2019-09-11 06:15:43

标签: java android firebase firebase-realtime-database

我想根据创建日期和时间从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) {

            }
        });


Firebase Users Data Image

1 个答案:

答案 0 :(得分:2)

您的代码中存在多个问题。

  

我没有找到其他方法来代替通过使用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(/* ... */);

第二个问题,要获得相关结果,请注意,时间戳记应存储为字符串:

  

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

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

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

  

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

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

或来自以下帖子:

编辑:

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

仅当您要阻止某个特定用户时,才应向child("0yozyNJzCvTWtRU8ufe5Zx8TPvu1")添加一个显式调用,否则就不需要这样做。

  

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

是的,它将起作用。试试看;)