【问题标题】:Is it possible to fetch data from a json similar to Firebases' DataSnapshot getChildren() and getValue() functions?是否可以从类似于 Firebase 的 DataSnapshot getChildren() 和 getValue() 函数的 json 中获取数据?
【发布时间】:2021-01-16 21:19:27
【问题描述】:

我的目标是使用 Firebase,而是使用本地 json 文件并从中获取数据,就像我使用 Firebase 的 DataSnapshot 函数:getChildren() 和 getValue() 一样。 p>

我一直在关注关于如何在 Android 上创建测验应用程序的 youtube 教程,这是我在 Firebase 上使用的 json:

{
  "Chapters" : {
    "chapter101" : {
      "name" : "Quiz Chapter 1",
      "sets" : 2
    },
    "chapter102" : {
      "name" : "Quiz Chapter 2",
      "sets" : 1
    },
  },
  "SETS" : {
    "chapter101" : {
      "questions" : {
        "question1" : {
          "correctAnswer" : "A",
          "optionA" : "A",
          "optionB" : "B",
          "optionC" : "C",
          "optionD" : "D",
          "question" : "Lorem ipsum...? (Question 1 from set number 1)",
          "setNo" : 1
        },
        "question2" : {
          "correctAnswer" : "B",
          "optionA" : "A",
          "optionB" : "B",
          "optionC" : "C",
          "optionD" : "D",
          "question" : "Lorem ipsum...? (Question 2 from set number 1)",
          "setNo" : 1
        },
        "question3" : {
          "correctAnswer" : "A",
          "optionA" : "A",
          "optionB" : "B",
          "optionC" : "C",
          "optionD" : "D",
          "question" : "Lorem ipsum...? (Question 1 from set number 2)",
          "setNo" : 2
        },
        "question4" : {
          "correctAnswer" : "B",
          "optionA" : "A",
          "optionB" : "B",
          "optionC" : "C",
          "optionD" : "D",
          "question" : "Lorem ipsum...? (Question 2 from set number 2)",
          "setNo" : 2
        }
      }
    },
    "chapter102" : {
      "questions" : {
        "question1" : {
          "correctAnswer" : "A",
          "optionA" : "A",
          "optionB" : "B",
          "optionC" : "C",
          "optionD" : "D",
          "question" : "Lorem ipsum...? (Question 1 from set number 1)",
          "setNo" : 1
        },
        "question2" : {
          "correctAnswer" : "B",
          "optionA" : "A",
          "optionB" : "B",
          "optionC" : "C",
          "optionD" : "D",
          "question" : "Lorem ipsum...? (Question 2 from set number 1)",
          "setNo" : 1
        }
      }
    }
  }
}

这就是我在 Java 代码中使用它的方式:

FirebaseDatabase database = FirebaseDatabase.getInstance();
DatabaseReference myRef = database.getReference();

private List<QuestionModel> list;

private String chapter;
private int setNo;

chapter = getIntent().getStringExtra("chapter");
setNo = getIntent().getIntExtra("setNo");

list = new ArrayList<>();

myRef.child("SETS").child(chapter).child("questions").orderByChild("setNo").equalTo(setNo).addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot snapshot) {
                for (DataSnapshot dataSnapshot : snapshot.getChildren()) {
                    list.add(dataSnapshot.getValue(QuestionModel.class));
                }
                
                if (list.size() > 0) {
                    for (int i = 0; i < 4; i++) {
                        optionsContainer.getChildAt(i).setOnClickListener(new View.OnClickListener() {
                            @Override
                            public void onClick(View v) {
                                Button correctOption = (Button) optionsContainer.findViewWithTag(list.get(position).getCorrectANS());
                                if (correctOption != null) {
                                    checkAnswer((Button) v);
                                }
                            }
                        });
                    }
                    playAnim(question, 0, list.get(position).getQuestion());
                    nextBtn.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View v) {
                            nextBtn.setEnabled(false);
                            nextBtn.setAlpha(0.7f);
                            enableOption(true);
                            position++;
                            if (position == list.size()) {
                                Intent scoreIntent = new Intent(QuestionsActivity.this, ScoreActivity.class);
                                scoreIntent.putExtra("score", score);
                                scoreIntent.putExtra("total", list.size());
                                startActivity(scoreIntent);
                                finish();
                                return;
                            }
                            count = 0;
                            playAnim(question, 0, list.get(position).getQuestion());
                        }
                    });
                } else {
                    finish();
                    Toast.makeText(QuestionsActivity.this, "-", Toast.LENGTH_SHORT).show();
                }
                loadingDialog.dismiss();
            }

            @Override
            public void onCancelled(@NonNull DatabaseError error) {
                Toast.makeText(QuestionsActivity.this, error.getMessage(), Toast.LENGTH_SHORT).show();
                loadingDialog.dismiss();
                finish();
            }
        });

QuestionModel.class 包含这些(以及 getter):

public class QuestionModel {
private String question, optionA, optionB, optionC, optionD, correctANS;
private int setNo;

public QuestionModel() {
 
}

public QuestionModel(String question, String optionA, String optionB, String optionC, String optionD, String correctANS, int setNo) {
    this.setNo = setNo;
    this.question = question;
    this.optionA = optionA;
    this.optionB = optionB;
    this.optionC = optionC;
    this.optionD = optionD;
    this.correctANS = correctANS;
}

【问题讨论】:

    标签: java android json firebase fetch


    【解决方案1】:

    Firebase 的 DataSnapshot getChildren 函数没有现有的等效项。因此,您必须通过手动解析 json 响应来自己创建一个。

    在从服务器以 json 格式获取响应后,您可以使用 Gson 库将其转换为模型类,以便于使用,而不是 getValue。但是,您必须创建此模型类并使其内容与 json 响应的内容相匹配。有关如何执行此操作的更多信息,您可以在此线程的answer 中找到。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-16
      • 2018-12-11
      • 1970-01-01
      • 2023-03-11
      • 2018-01-19
      • 2019-02-12
      • 1970-01-01
      • 2018-11-30
      相关资源
      最近更新 更多