gpt4 book ai didi

java - Android/FireStore QuerySnapshot 转换为 CustomObject

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:56:10 25 4
gpt4 key购买 nike

我目前正在编写一个测试 QuizApp。游戏玩法非常简单,我只需要一个在线问题数据库,用户可以回答这些问题。

这是数据库的样子:
enter image description here

该集合问题包含一个唯一 ID 和一个名为“内容”的自定义对象 (questionObject)。这个数字只是我可以查询/搜索的容易的东西。

这是我的 questionAdder 和查询 UI。这只是一个小测试应用程序。

公共(public)类 questionAdder 扩展 AppCompatActivity {

EditText pQuestion, pAnwerA, pAnswerB, pAnswerC, pAnswerD, number;
Button pAdd, query;
private DatabaseReference databaseReference;
private FirebaseFirestore firebaseFirestore;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.addquestion);

firebaseFirestore = FirebaseFirestore.getInstance();

pQuestion = (EditText) findViewById(R.id.question);
pAnwerA = (EditText) findViewById(R.id.answerA);
pAnswerB = (EditText) findViewById(R.id.answerB);
pAnswerC = (EditText) findViewById(R.id.answerC);
pAnswerD = (EditText) findViewById(R.id.answerD);
number = (EditText) findViewById(R.id.number);

pAdd = (Button) findViewById(R.id.addQuestion);
pAdd.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
readQuestionStore();
}
});

query = (Button) findViewById(R.id.query);
query.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
CollectionReference questionRef = firebaseFirestore.collection("questions");
questionRef.whereEqualTo("content.number", "20").get().addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
@Override
public void onSuccess(QuerySnapshot queryDocumentSnapshots) {
questionObject pContent = queryDocumentSnapshots.toObjects(questionObject.class);
}
});
}
});

}

public void readQuestionStore(){

Map<String, Object> pContent = new HashMap<>();
pContent.put("question", pQuestion.getText().toString());
pContent.put("Corr Answer", pAnwerA.getText().toString());
pContent.put("AnswerB", pAnswerB.getText().toString());
pContent.put("AnswerC", pAnswerC.getText().toString());
pContent.put("AnswerD", pAnswerD.getText().toString());
questionObject content = new questionObject(pContent, number.getText().toString()); //document("Essen").collection("Katalog")

firebaseFirestore.collection("questions").add(content).addOnSuccessListener(new OnSuccessListener<DocumentReference>() {
@Override
public void onSuccess(DocumentReference documentReference) {
Toast.makeText(questionAdder.this, "Klappt", Toast.LENGTH_LONG).show();
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Toast.makeText(questionAdder.this, "Klappt nicht", Toast.LENGTH_LONG).show();
}
});
}



这就是我的问题对象的样子:

公开课问题对象{

private Map<String, Object> content;
private String number;

public questionObject(){

}

public questionObject(Map<String, Object> pContent, String pNumber) {
this.content = pContent;
this.number = pNumber;
}

public Map<String, Object> getContent() {
return content;
}

public void setContent(Map<String, Object> content) {
this.content = content;
}

public String getNumber() {
return number;
}

public void setNumber(String number) {
this.number = number;
}



问题 在 onClickListener 的那个 questionAdder 类中,我收到“不兼容的类型”错误(找到:需要 java.utils.list:questionObject)。

query.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
CollectionReference questionRef = firebaseFirestore.collection("questions");
questionRef.whereEqualTo("content.number", "20").get().addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
@Override
public void onSuccess(QuerySnapshot queryDocumentSnapshots) {
questionObject pContent = queryDocumentSnapshots.toObjects(questionObject.class);
}
});
}
});

如果我将其更改为列表,它是空的。所以实际的问题是,如何使用数据库将 CustomObject 放入我的代码中。谢谢!

最佳答案

出现此错误的原因是 QuerySnapshot 是一种“包含”多个 文档的类型。 Firestore 不会为您决定结果是返回一堆对象,还是只返回一个对象。这就是为什么您可以采用两种不同的方法:

  1. 将数据放入自定义对象的列表中:

    List<questionObject> questionsList=new ArrayList<>();

    if (!documentSnapshots.isEmpty()){
    for (DocumentSnapshot snapshot:queryDocumentSnapshots)
    questionsList.add(snapshot.toObject(questionObject.class));

    }
  2. 如果你确定你只会得到一个查询对象,你可以只从返回的queryDocumentSnapshots中得到第一个对象:

    questionObject object=queryDocumentSnapshots.getDocuments().get(0).toObject(questionObject.class);

还有一些你应该知道的事情:

为什么要写content.number而不是number?看起来 number 是您的问题 document 中的一个单独字段,因此您的代码应如下所示:

CollectionReference questionRef = firebaseFirestore.collection("questions");
questionRef.whereEqualTo("number", "20").get().addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
@Override
public void onSuccess(QuerySnapshot queryDocumentSnapshots) {
questionObject pContent = queryDocumentSnapshots.toObjects(questionObject.class);
}
});

此外,尝试将您的number 字段更改为int,因为它不是String,而只是一个数字。

顺便说一句,类名以大写字母开头比较容易接受,例如:QuestionObject question=new QuestionObject();

关于java - Android/FireStore QuerySnapshot 转换为 CustomObject,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49599555/

25 4 0