无法从嵌套Firebase数据库捕获指定answer值的技术求助
解决Firebase数据库仅提取"answer"字段的问题
看起来你现在的困扰是遍历ANSWERS_LABEL下的子节点时,把每个节点里的vote count和answer都一并取出来了对吧?咱们调整下代码就能精准拿到你需要的answer值,给你两种可行的方案:
方案1:直接在循环中定位"answer"字段
这是最直接的做法,既然每个子节点里包含vote count和answer两个字段,那咱们直接在循环里指定提取answer即可:
public void onDataChange(DataSnapshot dataSnapshot) { Log.v("DataSnap", dataSnapshot.toString()); Log.v("DataSnap", dataSnapshot.child(USER_ID_LABEL).getValue().toString()); ArrayList<String> mPollAnswers = new ArrayList<>(); for (DataSnapshot y : dataSnapshot.child(ANSWERS_LABEL).getChildren()){ // 精准获取当前子节点下的"answer"字段值 String answer = y.child("answer").getValue(String.class); // 判空避免空指针异常 if (answer != null) { mPollAnswers.add(answer); Log.v("ANSWER", answer); } } }
说明:y代表ANSWERS_LABEL下的单个子节点,通过y.child("answer")直接定位到目标字段,再用getValue(String.class)将其转为字符串类型,同时加上判空逻辑更稳妥。
方案2:用实体类映射(更规范的长期方案)
如果你的投票答案节点结构固定(每个节点都有answer和vote count),建议创建一个实体类来映射数据,代码可读性和可维护性会更好:
首先定义实体类:
public class PollAnswer { // 字段名要和数据库里的键对应,或者用@PropertyName注解指定映射关系 private String answer; private int voteCount; // Firebase反序列化必须要有无参构造函数 public PollAnswer() {} // Getter方法 public String getAnswer() { return answer; } public int getVoteCount() { return voteCount; } }
然后在onDataChange中使用:
public void onDataChange(DataSnapshot dataSnapshot) { Log.v("DataSnap", dataSnapshot.toString()); Log.v("DataSnap", dataSnapshot.child(USER_ID_LABEL).getValue().toString()); ArrayList<String> mPollAnswers = new ArrayList<>(); for (DataSnapshot y : dataSnapshot.child(ANSWERS_LABEL).getChildren()){ PollAnswer pollAnswer = y.getValue(PollAnswer.class); if (pollAnswer != null && pollAnswer.getAnswer() != null) { mPollAnswers.add(pollAnswer.getAnswer()); Log.v("ANSWER", pollAnswer.getAnswer()); } } }
说明:这种方式把数据库节点和Java对象绑定,后续如果需要用到vote count字段,直接调用pollAnswer.getVoteCount()即可,非常方便扩展。
内容的提问来源于stack exchange,提问作者tccpg288
相关产品推荐
相关产品推荐

