【问题标题】:Android/FireStore QuerySnapshot convert to CustomObjectAndroid/FireStore QuerySnapshot 转换为 CustomObject
【发布时间】:2018-09-10 23:28:58
【问题描述】:

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

这是数据库的样子:


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

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

公共类 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();
        }
    });
}

}



这就是我的 questionObject 的样子:

公共类 questionObject{

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 放入我的代码中。谢谢!

【问题讨论】:

    标签: java android firebase google-cloud-firestore


    【解决方案1】:

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

    1. 将数据放入custom object的列表中:

      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();

    【讨论】:

      猜你喜欢
      • 2014-03-24
      • 1970-01-01
      • 1970-01-01
      • 2020-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-01
      相关资源
      最近更新 更多