# #java #android #firebase #google-cloud-platform #google-cloud-firestore
Вопрос:
Я добавил правила игры в Firebase Firestore в формате массива. Я хочу показать все строки массива в новых строках. Но когда я пытаюсь извлечь значение из firebase, я получаю эту ошибку: «foreach не применим к типу ‘com.google.база огня.магазин огня.Документальный снимок». Вот код,
Активность
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(){}
}
Комментарии:
1. Пожалуйста, отредактируйте свой вопрос и добавьте все полученное сообщение об ошибке.
2. @AlexMamo Отредактировал правильно. Пожалуйста, проверьте
3. В какой конкретной строке кода вы получаете эту ошибку?
4. @AlexMamo для(документ QuerDocumentSnapshot : документальный снимок). Эта строка показывает ошибку, а подчеркнутая строка-documentSnapshot
Ответ №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
массива, которые будут добавлены в представление Текст правила.
Приведенное выше решение будет работать только в том случае, если вы измените имя массива в базе matchRule
данных в соответствии с именем списка theRules
в вашем Rules
классе. Или вы добавляете следующую аннотацию перед получателем, как это:
@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;
}
}
Комментарии:
1. После применения я получаю следующую ошибку.
2. E/AndroidRuntime: ФАТАЛЬНОЕ ИСКЛЮЧЕНИЕ: основной процесс: com.luteraa.luteraaспорт, PID: 5202 java.lang. Исключение NullPointerException: Попытка вызвать виртуальный метод ‘java.util. Список com.luteraa.luteraaспорт. Rules.getMatchRule()’ для ссылки на нулевой объект в com.luteraa.luteraaesports. TournamentDetailsActivity$1.onSuccess(TournamentDetailsActivity.java:135) в com.luteraa.luteraaesports. TournamentDetailsActivity$1.onSuccess(TournamentDetailsActivity.java:128)
3. в com.google.android.gms.tasks.zzm.run(com.google.android.gms:play-services-tasks@@17.2.1:1) в android.os.Handler.handleCallback(Обработчик.java:938) в android.os.Обработчик.Отправка сообщений(Обработчик.java:99) в android.os. Looper.loop(петля.java:236) в android.app.ActivityThread.main(ActivityThread.java:8043) в java.lang.reflect. Метод.вызов(собственный метод) в com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:620) в com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1011)
4. пожалуйста, помогите мне с этим
5. Или измените код, как в моем обновленном ответе, и используйте
for (String rule : model.getMatchRule())
. теперь все в порядке?