【问题标题】:Sort Keys in Firebase Database AndroidFirebase 数据库 Android 中的排序键
【发布时间】:2018-09-10 06:43:41
【问题描述】:

这是我当前的 Firebase 数据库:

是否可以根据用户的评分对已经在数据库中的用户(例如,M57k..kNri..ulls..)进行排序?还是应该在入库前完成?

【问题讨论】:

  • 可以按一定的顺序检索用户,而不是直接在数据库中按顺序组织

标签: java android sorting firebase firebase-realtime-database


【解决方案1】:

在对 Firebase 数据库中的数据进行排序时,将 rating 存储为 String 并不是最佳选择。如果您将评级保留为字符串,请记住项目是按lexicographically 订购的。让我们举个例子。如果你用过数字,这是正常的顺序:

  • 1308
  • 1309
  • 1310
  • 1311

但是对于字符串,这是正常的顺序:

  • “1308”
  • “1309”
  • “131”
  • “1310”

据我所知,Firebase 中没有运算符,在大多数其他数据库中也没有允许您更改此行为的运算符。因此,我强烈建议您将数据类型更改为IntegerLong

如果您已经发布了应用程序,但我对此表示怀疑,因为我在您的数据库中看到了一些测试值,您需要知道这是您可以执行的操作,即使您使用的是字符串。您可以修改数据以获得您想要的行为。因此,您可以按字典顺序存储所需的值。您可以通过用零填充它们来实现:

  • "0131" //前面加零
  • "0132" //前面加零
  • ......
  • “1308”
  • “1309”
  • “1310”
  • “1311”

假设你已经改变了rating字段的类型,并且你想获取一个用户属性,按评分对项目进行排序,请使用以下代码:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference carpentersRef = rootRef.child("AvailableWorkers").child("Carpenters");
Query query = carpentersRef.orderByChild("rating")
ValueEventListener valueEventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for(DataSnapshot ds : dataSnapshot.getChildren()) {
            String g = ds.child("g").getValue(String.class);
            Log.d("TAG", g);
        }
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {}
};
query.addListenerForSingleValueEvent(valueEventListener);

输出将是由rating 属性排序的g 属性的值。

【讨论】:

  • 太棒了!它解决了!但是是否可以将评分从高到低排序?
  • 对不起,我的回答迟了。就是这样。将这些值添加到名为yourList 的列表中,并使用这行代码以相反的顺序进行排序。 Collections.reverse(yourList);.
  • 针对不同数据库的各种案例的酷答案,尤其是 lexicographically 的概念!谢谢你的回答[:
【解决方案2】:

你可以这样做:

DatabaseReference ref=FirebaseDatabase.getInstance().getReference().child("AvailableWorkers").child("Carpenters");
Query query=ref.orderByChild("rating").startAt("1");
query.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for(DataSnapshot datas: dataSnapshot.getChildren()){
   String keys=datas.getKey();
  }
}
  @Override
public void onCancelled(DatabaseError databaseError) {
   }
 });

使用上面的查询将返回评分开始等于 1,orderByChild("rating").startAt("1");的结果

这个String keys=datas.getKey();会根据查询给你用户的ID。

【讨论】:

  • 嗨彼得,感谢您的回答。好像我在初始化数据库时遇到错误,说它应该是一个查询?
猜你喜欢
  • 2017-10-07
  • 2016-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多