【问题标题】:Creating a quiz with randomly generated questions using Firebase使用 Firebase 使用随机生成的问题创建测验
【发布时间】:2019-12-10 15:18:01
【问题描述】:

我正在尝试使用我的 firebase 数据库在 android 中创建一个测验,在此,我希望随机生成不重复的问题。

到目前为止,我已经成功开发了一个随机生成问题的测验,尽管同样的问题可以重复。

例如: 我问了四个问题,这些都是从我的 firebase 数据库中提取的,我的任何问题都可以使用。在问题 1 中可能会显示 id 为 4 的问题。问题 2 可能会再次显示 id 为 4 的问题,因为没有什么可以说问题 4 无法显示。

 FirebaseAuth mFirebaseAuth = FirebaseAuth.getInstance();
        FirebaseUser user = mFirebaseAuth.getCurrentUser();
        userid = Objects.requireNonNull(user).getUid();
        mRootRef = FirebaseDatabase.getInstance().getReference().child("Review Questions");

        if(total >4) {

            description.setText("Completed");
            details();

        }
        else
        {
            int n = rand.nextInt(9);
            int n2 = n +1;
            //if the number has been selected, so add the selected items to a list.
            DatabaseReference databaseref = FirebaseDatabase.getInstance().getReference().child("Questions").child("Plastic").child(String.valueOf(n2));
            databaseref.addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                    final Question question = dataSnapshot.getValue(Question.class);
                    t1_question.setText(Objects.requireNonNull(question).getQuestion());
                    b1.setText(question.getAnswer1());
                    b2.setText(question.getAnswer2());
                    b3.setText(question.getAnswer3());
                    b4.setText(question.getAnswerCorrect());

这是我的原始代码,我想如果我将所有问题添加到数组列表中,那么每次我提出问题时,我都可以简单地从数组中删除该问题。

我已经尝试过这种方式:

DatabaseReference databaseref = FirebaseDatabase.getInstance().getReference().child("Questions").child("Plastic");
            databaseref.addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

                    question= dataSnapshot.getValue(Question.class);
                    list.add(new Question(question.getQuestion(),question.getDifficulty(), question.getAnswer1(),question.getAnswer2(), question.getAnswer3(), question.getAnswerCorrect(),question.getCategory(),question.getId() ,question.getDescription(), question.getScore()));


               }

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

                }
            });
              x = list.size();
                    n = rand.nextInt(x);


            if(total >4) {

                description.setText("Completed");
                details();

            }
            else
            {
                        //declare as a global variable, in the class then access
               question = list.get(n);
                        t1_question.setText(question.getQuestion());
                        b1.setText(question.getAnswer1());
                        b2.setText(question.getAnswer2());
                        b3.setText(question.getAnswer3());
                        b4.setText(question.getAnswerCorrect());

由于某种原因,这些问题不会添加到我的数组中,我似乎无法理解为什么。有没有更好的解决方案?

【问题讨论】:

  • 声明一个整数数组并将生成的id放入其中,每次随机检查该id是否存在于数组中,如果不存在则重新生成另一个id。

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


【解决方案1】:

databaseref.addValueEventListener 是异步的,在查询完成之前立即返回。当数据可用时,您提供给它的回调将在一段时间后被调用。您的代码继续假设 list 包含一些数据,而实际上它还没有。相反,您必须做的只是在调用回调后处理 list 的内容。因此,您需要将后续代码放入回调本身或其他内容中,以确保仅在填充 list 后才会调用它。

【讨论】:

  • 对不起,我没有完全理解你的意思,我不明白为什么它没有填充列表?因为它是异步的,所以来自 firebase 的数据不应该立即添加到 Question 的 Array 列表中吗?然后我试图从列表中调用,但当然,列表没有填充。我也尝试在数据库 ref.addValueEventListener 调用下直接添加数据,尽管这会导致返回空白。
  • 我删除了`x = list.size(); n = rand.nextInt(x)` 来自databaseref.addValueEventListener 并进一步创建了一个新方法,因此在侦听器完成之前不会执行代码。它仍然是空的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-10
相关资源
最近更新 更多