【问题标题】:Getting error, foreach not applicable to type 'com.google.firebase.firestore.DocumentSnapshot'出现错误,foreach 不适用于类型“com.google.firebase.firestore.DocumentSnapshot”
【发布时间】:2021-11-16 04:24:56
【问题描述】:

我在 Firebase Firestore 中添加了数组格式的游戏规则。我想在新行中显示数组的所有字符串。但是当我试图从 firebase 中提取值时,我收到了这个错误,“foreach not applicable to type 'com.google.firebase.firestore.DocumentSnapshot'”。 这是代码,

活动

    FirebaseFirestore.getInstance().collection("categories").document(categoryId).collection("rules").document("rule").get().addOnSuccessListener(new OnSuccessListener<DocumentSnapshot>() {
        @Override
        public void onSuccess(@NonNull DocumentSnapshot documentSnapshot) {
            String data = "";
            for (QueryDocumentSnapshot doc : documentSnapshot) {
                Rules model = doc.toObject(Rules.class);
                App.logMessage("Item Added" + model.oneRule);

                for (String rule : model.getTheRules()) {
                    data += "\n*" + rule;
                }
                //rules.add(model);
                rule.setText(data);
            }
        }
    });

型号

public class Rules {

List<String> theRules;

public Rules(List<String> theRules) {
    this.theRules = theRules;
}

public List<String> getTheRules() {
    return theRules;
}

public void setTheRules(List<String> theRules) {
    this.theRules = theRules;
}

public Rules(){}

}

Firestore 屏幕截图

【问题讨论】:

  • 请编辑您的问题并添加您收到的整个错误消息。
  • @AlexMamo 已正确编辑。请检查
  • 您在哪一行代码中遇到了这个错误?
  • @AlexMamo for(QuerDocumentSnapshot 文档:documentSnapshot)。此行显示错误,下划线为 documentSnapshot

标签: java android firebase google-cloud-platform google-cloud-firestore


【解决方案1】:

当您使用以下参考时:

FirebaseFirestore.getInstance().collection("categories")
    .document(categoryId).collection("rules").document("rule")

这意味着您正在尝试读取名为“规则”的单个文档的内容。当您调用get() 并附加一个成功侦听器时,来自onSuccess() 方法的参数是DocumentSnapshot 类型,它不是一个可迭代对象。因此,您无法迭代这样的对象,因此会出现错误。如果您想将“规则”文档映射到“规则”类型的对象,则删除 for 循环并简单地使用:

FirebaseFirestore.getInstance().collection("categories").document(categoryId).collection("rules").document("rule").get().addOnSuccessListener(new OnSuccessListener<DocumentSnapshot>() {
    @Override
    public void onSuccess(@NonNull DocumentSnapshot documentSnapshot) {
        String data = "";
        Rules model = doc.toObject(Rules.class);
        for (String rule : model.getTheRules()) {
            data += "\n*" + rule;
        }
        rule.setText(data);
    }
});

以上代码行的结果将是matchRule数组中所有规则的串联,将添加到规则TextView中。

上述解决方案在您更改数据库matchRule 中的数组名称以匹配Rules 类中的列表theRules 的名称时才有效。或者您在 getter 前面添加以下注释,如下所示:

@PropertyName("matchRule")
public List<String> getTheRules() {
    return theRules;
}

编辑:

public class Rules {

    public Rules(){}

    List<String> matchRule;

    public Rules(List<String> matchRule) {
        this.matchRule = matchRule;
    }

    public List<String> getMatchRule() {
        return matchRule;
    }

    public void setMatchRule(List<String> matchRule) {
        this.matchRule = matchRule;
    }
}

【讨论】:

  • 应用后,我收到以下错误。
  • E/AndroidRuntime:致命异常:主进程:com.luteraa.luteraaesports,PID:5202 java.lang.NullPointerException:尝试调用虚拟方法'java.util.List com.luteraa.luteraaesports。 Rules.getMatchRule()' 在 com.luteraa.luteraaesports.TournamentDetailsActivity$1.onSuccess(TournamentDetailsActivity.java:135) 的空对象引用上在 com.luteraa.luteraaesports.TournamentDetailsActivity$1.onSuccess(TournamentDetailsActivity.java:128)
  • 在 com.google.android.gms.tasks.zzm.run(com.google.android.gms:play-services-tasks@@17.2.1:1) 在 android.os.Handler .handleCallback(Handler.java:938) 在 android.os.Handler.dispatchMessage(Handler.java:99) 在 android.os.Looper.loop(Looper.java:236) 在 android.app.ActivityThread.main(ActivityThread. java:8043) 在 java.lang.reflect.Method.invoke(Native Method) 在 com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:620) 在 com.android.internal.os.ZygoteInit。主(ZygoteInit.java:1011)
  • 请帮我解决这个问题
  • 或者按照我更新的答案更改代码并使用for (String rule : model.getMatchRule())。现在还好吗?
猜你喜欢
  • 1970-01-01
  • 2018-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-31
  • 2013-03-30
  • 2011-09-30
  • 1970-01-01
相关资源
最近更新 更多