我想根据创建日期和时间从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) {
}
});
答案 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()也可以为子孩子工作?
是的,它将起作用。试试看;)