【问题标题】:How to sort data ascending order Firebase Database如何对数据升序排序 Firebase 数据库
【发布时间】:2018-03-26 23:46:25
【问题描述】:

嗨,我正在尝试按升序对用户进行排序,首先这是我的树: 我想按 scoreTotal 对用户进行排序,我尝试过使用 categries.orderByChild("scoreTotal").orderByValue() 但不起作用这是我的代码:

public class Scores extends  Fragment {

    RecyclerView userlist;
    int i = 0;
    RecyclerView.LayoutManager layoutManager;
    FirebaseRecyclerAdapter<User, usersViewHolder> adapter;
    FirebaseDatabase database;
    ProgressBar loading;
    DatabaseReference categries, mDatabase;

    public Scores() {
        // Required empty public constructor
    }

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        categries = FirebaseDatabase.getInstance().getReferenceFromUrl("https://quizapp.firebaseio.com/Quizy/users");

    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View v = inflater.inflate(R.layout.fragment_scores, container, false);
        userlist = v.findViewById(R.id.users);
        loading = v.findViewById(R.id.progress);
        layoutManager = new GridLayoutManager(getActivity(), 1);
        userlist.setLayoutManager(layoutManager);
        userlist.setHasFixedSize(true);
        mDatabase = FirebaseDatabase.getInstance().getReference();
        loadCategories();
        return v;
    }

    private void loadCategories() {

        adapter = new FirebaseRecyclerAdapter<User, usersViewHolder>(User.class, R.layout.useitem, usersViewHolder.class, categries.orderByChild("scoreTotal").orderByValue()) {
            @SuppressLint("CheckResult")
            @Override
            protected void populateViewHolder(final usersViewHolder viewHolder, final User model, int position) {
                viewHolder.getUserName().setText(model.getUsername());
                viewHolder.getUserScore().setText("Score : "+model.getScoreTotal());
                RequestOptions requestOptions = new RequestOptions();
                requestOptions.diskCacheStrategy(DiskCacheStrategy.ALL).dontTransform();
                Glide.with(getActivity()).load(model.getImageBase64()).apply(requestOptions).listener(new RequestListener<Drawable>() {
                    @Override
                    public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Drawable> target, boolean isFirstResource) {
                        return false;
                    }

                    @Override
                    public boolean onResourceReady(Drawable resource, Object model, Target<Drawable> target, DataSource dataSource, boolean isFirstResource) {
                        viewHolder.getProgressBar().setVisibility(View.GONE);
                        viewHolder.getUserpic().setVisibility(View.VISIBLE);
                        return false;

                    }
                }).into(viewHolder.getUserpic());
            }


            @Override
            public usersViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
                usersViewHolder viewHolder = super.onCreateViewHolder(parent, viewType);
                viewHolder.setItemOnClick(new itemOnClick() {
                    @Override
                    public void onClick(View v, int pos, boolean isLong) {

                    }
                });
                return viewHolder;
            }
        };
        adapter.notifyDataSetChanged();
        userlist.setAdapter(adapter);

    }
}

【问题讨论】:

  • 查看来自 Firebase 的 @Frank 的 answer 关于数据排序的信息。
  • 这个categries.orderByChild("scoreTotal").orderByValue() 没有意义,它应该只是categries.orderByChild("scoreTotal")。这样,20 应该显示在60 之前。但除此之外(正如 Drei 回答的那样),订单将受到您将数值存储为字符串这一事实的影响。
  • 添加另一个子日期并按子日期使用订单

标签: java android firebase firebase-realtime-database


【解决方案1】:

scoreTotal 是数据库中的一个字符串。

如果您已将值作为数字(通常为整数)上传,则其周围不会有引号。

最快的解决方案是重新评估您的上传代码以发送一个 int。我强烈推荐这种方法,因为它是迄今为止最快的。

作为旁注,您需要将 ".indexOn": ["scoreTotal"] 添加到您的数据库规则中。

此外,如有必要,您可以在上传之前使用云函数解析字符串(即由于某种原因无法直接上传 int)。

您也可以在客户端实用地解析和排序它们,但因为这是最苛刻的解决方案,我不会解释它。

【讨论】:

    猜你喜欢
    • 2017-08-20
    • 2018-05-23
    • 1970-01-01
    • 2020-03-24
    • 2018-01-20
    • 1970-01-01
    • 2017-07-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多