簡體   English   中英

誰能告訴我如何在 Firebase Firestore (Android) 中存儲一組自定義對象

[英]Can anyone tell me how can I store an array of custom objects in Firebase Firestore (Android)

誰能告訴我如何從一個應用程序將一組自定義對象存儲在 Firebase Firestore (Android) 中,然后將對象檢索回另一個應用程序(這兩個應用程序都連接到同一個 Firebase 項目)。 我嘗試使用地圖,並且能夠存儲訂單列表,但無法檢索 ArrayList。 我是這樣做的:

Map<String, ArrayList<OrderItemModel>> map = new HashMap<>();
map.put(currentOrderNumber, orderList);
firebaseFirestore.collection("orders").document(college).set(map, SetOptions.merge())
        .addOnSuccessListener(new OnSuccessListener<Void>() {
    @Override
    public void onSuccess(Void aVoid) {
        Toast.makeText(getContext(), "Order placed.", Toast.LENGTH_SHORT).show();
    }
}).addOnFailureListener(new OnFailureListener() {
    @Override
    public void onFailure(@NonNull Exception e) {
        Toast.makeText(getContext(), "Couldn't place order. Please try again.", Toast.LENGTH_SHORT).show();
        progressBar.setVisibility(View.GONE);
    }
});

當我嘗試使用 documentSnapshot.getData() 檢索它時,它返回 Map<String, Object>。 我嘗試將 Object 轉換為 ArrayList 並在 RecyclerView 適配器中使用它,但它顯示錯誤。 這是我的 OrderItemModel class:

public class OrderItemModel {

    private String itemName;
    private String itemPrice;
    private String itemCount;

    public OrderItemModel() {
    }

    public OrderItemModel(String itemName, String itemPrice, String itemCount) {
        this.itemName = itemName;
        this.itemPrice = itemPrice;
        this.itemCount = itemCount;
    }

    public String getItemName() {
        return itemName;
    }

    public void setItemName(String itemName) {
        this.itemName = itemName;
    }

    public String getItemPrice() {
        return itemPrice;
    }

    public void setItemPrice(String itemPrice) {
        this.itemPrice = itemPrice;
    }

    public String getItemCount() {
        return itemCount;
    }

    public void setItemCount(String itemCount) {
        this.itemCount = itemCount;
    }
}

我的 Firebase 防火牆: 在此處輸入圖像描述

我一直試圖解決這個問題一個星期,但仍然沒有得到任何地方。 我已經嘗試了很多東西,但仍然找不到解決方案。 如果有什么不清楚的請詢問。 請幫忙。 謝謝你。

編輯:

我正在以下列方式檢索數據:

firebaseFirestore.collection("orders").document(college).get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
    @Override
    public void onComplete(@NonNull Task<DocumentSnapshot> task) {
        if (task.isSuccessful()) {
            DocumentSnapshot documentSnapshot = task.getResult();
            assert documentSnapshot != null;
            if (documentSnapshot.exists()) {
                Map<String, Object> listMap = documentSnapshot.getData();
                for (Map.Entry<String, Object> entry : listMap.entrySet()) {
                    Log.d(TAG, "onComplete: Key: " + entry.getKey() + ", Value: " + entry.getValue().toString());
                    if (entry.getKey().equals(currentOrderNumber)) {
                        orderList.addAll((Collection<? extends OrderItemModel>) entry.getValue());
                    }
                }
                Log.d(TAG, "onComplete: ArrayList: " + orderList.get(0).getItemName());         // This line shows error.
                progressBar.setVisibility(View.GONE);
            } else {
                Toast.makeText(ShowOrder.this, "Order document not found!", Toast.LENGTH_SHORT).show();
            }
        } else {
            Toast.makeText(ShowOrder.this, "An error occurred while fetching the data.", Toast.LENGTH_SHORT).show();
        }
    }
});

據我了解,我成功地以 Map<String, Object> 的形式檢索數據,但無法從中提取 ArrayList。

Log.d(TAG, "onComplete: ArrayList: " + orderList.get(0).getItemName());

上面的行顯示以下錯誤:

2021-01-10 23:48:40.192 8747-8747/com.campuscanteen.main E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.campuscanteen.main, PID: 8747
    java.lang.ClassCastException: java.util.HashMap cannot be cast to com.campuscanteen.main.Models.OrderItemModel
        at com.campuscanteen.main.ShowOrder$2.onComplete(ShowOrder.java:89)
        at com.google.android.gms.tasks.zzj.run(Unknown Source:4)
        at android.os.Handler.handleCallback(Handler.java:883)
        at android.os.Handler.dispatchMessage(Handler.java:100)
        at android.os.Looper.loop(Looper.java:230)
        at android.app.ActivityThread.main(ActivityThread.java:7815)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:526)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1034)

編輯2:

我按照你的建議做了一個 class :

public class OrderList {
    public List<OrderItemModel> modelList;

    public OrderList() {
    }

    @Override
    public String toString() {
        return "OrderList{" +
                "modelList=" + modelList +
                '}';
    }
}

並嘗試了這些行來檢索數據:

List<OrderItemModel> myLists = documentSnapshot.toObject(OrderList.class).modelList;
                        Log.d(TAG, "onComplete: ArrayList: " + myLists.toString());  // myLists here has null value.

這樣列表就有了 null 值。 請原諒我缺乏知識,請幫助。

您收到以下錯誤:

java.lang.ClassCastException: java.util.HashMap cannot be cast to com.campuscanteen.main.Models.OrderItemModel

因為您正在嘗試將 HashMap 類型的 object 轉換為 OrderItemModel 類型的 object,這實際上在 ZD52817878D375A27 中是不可能的

看到您的屏幕截圖,您的文檔包含一個名為“201”的數組類型的屬性。 該數組包含術語“OrderItemModel”對象。 我不確定你為什么要這樣稱呼這個數組,因為“orderItems”可能更有意義。 但是,對於 map 數組到List<OrderItemModel> ,您應該簡單地創建一個具有單個屬性的 class :

class OrdersDocument {
    public List<OrderItemModel> orderItems;
}

現在,您可以創建對文檔的引用、附加偵聽器並將數組轉換為自定義對象列表:

List<OrderItemModel> orderItems = document.toObject(OrdersDocument.class).orderItems;

正如我在以下鏈接的文章中所解釋的那樣:

如何將 Cloud Firestore 中的對象數組 map 到對象列表?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM