java - 如何处理 Firebase 数据库的异步特性

标签 java android firebase firebase-realtime-database

由于我的测验应用程序中 Firebase 数据库的异步特性,我面临此问题。问题分数包含当前用户及其分数。排名包含用户及其相应的分数。问题分数存储了分数,但是当我正在用分数更新排名数据库...排名对象中的分数值被重置为零。我应该如何处理这个问题?

我已经尝试使用排名回调来更新数据库,但没有成功。

public class RankingFragment extends Fragment {
    View myFragment;
    RecyclerView rankingList;
    LinearLayoutManager layoutManager;
    FirebaseRecyclerAdapter<Ranking, RankingViewHolder> adapter;

    FirebaseDatabase database;
    DatabaseReference questionScore, rankingTbl;
    String k;
    int sum=0;

    public static RankingFragment newInstance() {
        RankingFragment rankingFragment = new RankingFragment();
        return rankingFragment;
    }

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        database = FirebaseDatabase.getInstance();
        questionScore = database.getReference("Question_Score");
        rankingTbl = database.getReference("Ranking");
    }


    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        myFragment = inflater.inflate(R.layout.fragment_ranking, container, false);
        rankingList = (RecyclerView) myFragment.findViewById(R.id.rankingList);
        layoutManager = new LinearLayoutManager(getActivity());
        rankingList.setHasFixedSize(true);
        layoutManager.setReverseLayout(true);
        layoutManager.setStackFromEnd(true);
        rankingList.setLayoutManager(layoutManager);


        updateScore(Common.currentUser.getUsername());
        return myFragment;

    }

    private void updateScore(final String username)
    {
        questionScore.orderByChild("user").equalTo(username).addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

                for (DataSnapshot data : dataSnapshot.getChildren()) {
                    QuestionScore ques = data.getValue(QuestionScore.class);
                    sum+=Integer.parseInt(ques.getScore());
                }
                Ranking ranking = new Ranking(username, sum);
                rankingTbl.child(ranking.getUsername()).setValue(ranking);
                adapter = new FirebaseRecyclerAdapter<Ranking, RankingViewHolder>(
                        Ranking.class, R.layout.layout_ranking, RankingViewHolder.class, rankingTbl.orderByChild("marks")
                ) {
                    @Override
                    protected void populateViewHolder(final RankingViewHolder viewHolder, Ranking model, int position) {
                        viewHolder.txt_name.setText(model.getUsername());
                        viewHolder.txt_score.setText(String.valueOf(model.getMarks()));

                    }
                };
                finish();


            }

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

            }
        });

    }

    private void finish() {
        adapter.notifyDataSetChanged();
        rankingList.setAdapter(adapter);
    }
}

排名数据库的分数存储 0,因此 View 持有者也填充零,而它应该存储当前用户的分数(存储在“sum+=Integer.parseInt(ques.getScore());”中

最佳答案

您正在将 QuestionScore 中的值分配给 sum,而不应该像添加所有 QuestionScore

for (DataSnapshot data : dataSnapshot.getChildren()) {
    QuestionScore ques = data.getValue(QuestionScore.class);
    sum+=Integer.parseInt(ques.getScore()); // <--- changed = to +=
}

关于java - 如何处理 Firebase 数据库的异步特性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56866180/

相关文章:

java - 使用 Swing 布局我的基本应用程序很困难

java - 如何将 BufferedImage 放入 ByteBuffer 中?

android - 整合我的 Android 应用程序中的 Activity 数量

java - 从 Android 中的 Openfire 服务器获取所有用户的列表

reactjs - 如何编写文档 Firestore

java - 删除时 CASCADE 在 hibernate 中的多对多映射中不起作用

java - 如何写入分区/数据文件?

javascript - 按发布降序显示帖子

android - Firebase Firestore,获取另一个文档中的引用文档

java - 正则表达式匹配只有一个 C 的字符串