繁体   English   中英

Firestore:在文档中获取 object 的数组

[英]Firestore : Get an array of object in a document

因此,在我的应用程序中,我想显示有关食谱的多个信息。 在食谱中,您可以看到类别、名称……以及成分列表。 我想获取此列表以显示配方的详细信息。

数据库

目前(在屏幕上)可以看到名称、类别、完成时间、难度和人数。

基本画面

现在在这个屏幕上,我想要得到的结果:

新结果

我通过手动将对象添加到列表中来获得它。

ingredients.add(new Ingredient("Test", "1500"));

IngredientsAdapter adapt = new IngredientsAdapter(ViewRecette.this, R.layout.adapter_ingredients, ingredients);
listIngredients.setAdapter(adapt);

现在为了使它起作用,我正在尝试使用此代码,但出现此错误。

ingredients = (ArrayList<Ingredient>) documentSnapshot.get("Ingrédients");

IngredientsAdapter adapt = new IngredientsAdapter(ViewRecette.this, R.layout.adapter_ingredients, ingredients);
listIngredients.setAdapter(adapt);

错误是:

E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.learncooking, PID: 21971
java.lang.ClassCastException: java.util.HashMap cannot be cast to com.example.learncooking.Ingredient
    at com.example.learncooking.IngredientsAdapter.getView(IngredientsAdapter.java:40)
    at com.example.learncooking.ViewRecette$1.onEvent(ViewRecette.java:103)
    at com.example.learncooking.ViewRecette$1.onEvent(ViewRecette.java:82)
    at com.google.firebase.firestore.DocumentReference.lambda$addSnapshotListenerInternal$2(DocumentReference.java:504)
    at com.google.firebase.firestore.DocumentReference$$Lambda$3.onEvent(Unknown Source:6)
    at com.google.firebase.firestore.core.AsyncEventListener.lambda$onEvent$0(AsyncEventListener.java:42)
    at com.google.firebase.firestore.core.AsyncEventListener$$Lambda$1.run(Unknown Source:6)
    at android.os.Handler.handleCallback(Handler.java:900)
    at android.os.Handler.dispatchMessage(Handler.java:103)
    at android.os.Looper.loop(Looper.java:219)
    at android.app.ActivityThread.main(ActivityThread.java:8387)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:513)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1055)

我正在努力解决这个问题,提前感谢您的回答。

编辑 1

所以我现在正在尝试使用 POJO,但我真的不明白如何做到这一点。 我正在使用以下代码(我对此不确定)但如何使用它来显示它?

DocumentSnapshot document = (DocumentSnapshot) documentSnapshot.get("Ingrédients");;
                    if (document.exists()) {
                        IngredientPOJO notifPojo = document.toObject(IngredientPOJO.class);
                    }

和“POJO”文件:

public class IngredientPOJO {

@SerializedName("ingredient")
@Expose
private List<Ingredient> ingredients;

public IngredientPOJO() {

}

public IngredientPOJO(List<Ingredient> ingredients) {
    this.ingredients = ingredients;
}

public List<Ingredient> getIngredients() {
    return ingredients;
}

public void setIngredients(List<Ingredient> ingredients) {
    this.ingredients = ingredients;
}

编辑 2

我也在这里修改了一些小项目。

private TextView nomRecette, tempsTotal, diff, nbPersonne, cat;
private ImageView receteImage;
private ListView listIngredients, listEtapes;
ArrayList<Ingredient> ingredients;
ArrayList<Etapes> etapes = new ArrayList<>();

private FirebaseFirestore firebaseFirestore;
private DocumentReference documentReference;
private FirebaseStorage firebaseStorage;

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

    receteImage = (ImageView) findViewById(R.id.ivPhotoRecetteView);
    nomRecette = (TextView) findViewById(R.id.tvNomRecetteView);
    cat = (TextView) findViewById(R.id.tvCatégorie);
    tempsTotal = (TextView) findViewById(R.id.tvTempsTotal);
    diff = (TextView) findViewById(R.id.tvDifficulté);
    nbPersonne = (TextView) findViewById(R.id.tvNombrePersonnesView);
    listIngredients = (ListView) findViewById(R.id.lvIngredientsView);
    listEtapes = (ListView) findViewById(R.id.lvEtapesView);

    Intent intent = getIntent();
    String i = intent.getStringExtra("ID");

    firebaseFirestore = FirebaseFirestore.getInstance();
    firebaseStorage = FirebaseStorage.getInstance();

    documentReference = firebaseFirestore.collection("Recettes").document(i);
    documentReference.addSnapshotListener(ViewRecette.this, new EventListener<DocumentSnapshot>() {// Display data in TextView
        @Override
        public void onEvent(@Nullable DocumentSnapshot documentSnapshot, @Nullable FirebaseFirestoreException e) {
            if (e == null) {
                if (documentSnapshot.exists()) {

                    nomRecette.setText(documentSnapshot.getString("Nom"));
                    cat.setText(documentSnapshot.getString("Catégorie"));
                    tempsTotal.setText(documentSnapshot.getString("Temps"));
                    diff.setText(documentSnapshot.getString("Difficulté"));
                    nbPersonne.setText(documentSnapshot.getString("Nombre de personnes"));

                    if (documentSnapshot.exists()) {
                        IngredientPOJO notifPojo = documentSnapshot.toObject(IngredientPOJO.class);
                        ingredients =  new ArrayList<>();
                        ingredients.addAll(notifPojo.getIngredients());
                    }

                    IngredientsAdapter adapter = new IngredientsAdapter(ViewRecette.this, R.layout.adapter_ingredients, ingredients);
                    listIngredients.setAdapter(adapter);

最后是新的错误:

2021-05-03 21:25:28.367 5485-5485/com.example.learncooking E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.learncooking, PID: 5485
java.lang.NullPointerException: Attempt to invoke interface method 'java.lang.Object[] java.util.Collection.toArray()' on a null object reference
    at java.util.ArrayList.addAll(ArrayList.java:588)
    at com.example.learncooking.ViewRecette$1.onEvent(ViewRecette.java:98)
    at com.example.learncooking.ViewRecette$1.onEvent(ViewRecette.java:83)
    at com.google.firebase.firestore.DocumentReference.lambda$addSnapshotListenerInternal$2(DocumentReference.java:504)
    at com.google.firebase.firestore.DocumentReference$$Lambda$3.onEvent(Unknown Source:6)
    at com.google.firebase.firestore.core.AsyncEventListener.lambda$onEvent$0(AsyncEventListener.java:42)
    at com.google.firebase.firestore.core.AsyncEventListener$$Lambda$1.run(Unknown Source:6)
    at android.os.Handler.handleCallback(Handler.java:938)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:223)
    at android.app.ActivityThread.main(ActivityThread.java:7656)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)

你需要改变一些事情。

里面的IngredientPOJO POJO class 改变Object ingredient; List<Ingredient> ingredients; 以及相应的 getter、setter 方法。

然后在这条线以下。

IngredientPOJO notifPojo = document.toObject(IngredientPOJO.class);

从该 object 中获取列表并添加所有。

如下例:

IngredientPOJO notifPojo = document.toObject(IngredientPOJO.class);
ingrediants.addAll(notifPojo.getIngredient())

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM