Как бороться с асинхронной природой базы данных Firebase - PullRequest
0 голосов
/ 03 июля 2019

Я сталкиваюсь с этой проблемой из-за асинхронной природы базы данных 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, и, таким образом, держатель представления также заполняется нулями, тогда как он должен хранить счет текущего пользователя (хранится в «sum + = Integer.parseInt (Ques.getScore ());»

1 Ответ

0 голосов
/ 03 июля 2019

Вы присваиваете значение от QuestionScore до sum, вместо этого это должно быть похоже на добавление всех QuestionScore значений

for (DataSnapshot data : dataSnapshot.getChildren()) {
    QuestionScore ques = data.getValue(QuestionScore.class);
    sum+=Integer.parseInt(ques.getScore()); // <--- changed = to +=
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...