Android:使用 ArrayList 从 Firebase 检索对象

Posted

技术标签:

【中文标题】Android:使用 ArrayList 从 Firebase 检索对象【英文标题】:Android: Retrieve object with ArrayList from Firebase 【发布时间】:2016-10-30 19:26:38 【问题描述】:

我是 Firebase 的新手,面临以下问题:

我将一个对象(Bill)上传到我的 Firebase,其中一个属性是 ArrayList。它适用于上传。

但是当我检索数据时,由于 ArrayList 而出现错误

com.firebase.client.FirebaseException: Failed to bounce to type

主要活动:

Firebase billRef = new Firebase(getResources().getString(R.string.FB_billRef));

Query billQuery = billRef.orderByChild("status").equalTo("Ordered");
billQuery.addChildEventListener(
        new ChildEventListener() 
            @Override
            public void onChildAdded(DataSnapshot dataSnapshot, String s) 
                Bill bill = dataSnapshot.getValue(Bill.class);

            

            @Override
            public void onChildChanged(DataSnapshot dataSnapshot, String s) 

            

            @Override
            public void onChildRemoved(DataSnapshot dataSnapshot) 

            

            @Override
            public void onChildMoved(DataSnapshot dataSnapshot, String s) 

            

            @Override
            public void onCancelled(FirebaseError firebaseError) 

            
        
);

Bill.class:

public class Bill 

    private int billID;
    private int tableID;
    private int numCustomer;
    private String status;
    private ArrayList<Order> orders;


    public Bill(int billID, int tableID, int numCustomer,String status,ArrayList<Order> orders)
        this.billID = billID;
        this.tableID = tableID;
        this.numCustomer = numCustomer;
        this.status = status;
        this.orders = orders;
    

    public ArrayList<Order> getOrders() 
        return orders;
    

    public void setOrders(ArrayList<Order> orders)
        this.orders = orders;
    
    public void addOrder(Order o)

    public void delOrder(int orderID)

    public int getBillID()return billID;
    public int getTableID()return tableID;
    public int getNumCustomer()return numCustomer;
    public String getStatus()return status;


如何将这种类型的 firebase 对象检索到 java 对象? 非常感谢!

我必须处理的唯一方法是一一分解 DataSnapshot 属性并使用 datasnapshot.child("orders").getChildren()

但这不是一个好方法。有什么方法可以直接获取账单对象吗?

【问题讨论】:

你试过用List代替ArrayList吗? 在您的 logcat 中,在该错误消息下,将有一个堆栈跟踪。在该堆栈跟踪中,它将指定问题的实际原因(通常在Caused by 之后)。 尝试向Bill添加一个无参数构造函数。 Re adolfosrs:我做了,但出现了同样的错误。 @FrankvanPuffelen 该错误是由 ArrayList 命令引起的。以下是错误:Caused by: com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of java.util.ArrayList out of START_OBJECT token at [Source: java.io.StringReader@1d5e2d2; line: 1, column: 32] (through reference chain: com.test.Class.Bill["orders"]) 【参考方案1】:

我知道对于提问的人我可能会迟到一点,但至少对其他人来说...... 使用 HashMaps 而不是 ArrayLists 很有帮助。 Firebase 基于哈希图,因此您可以通过键访问任何属性。在这种情况下,建议您使用 HashMap,而不是由数组列表表示的 Bills 属性。 (这也有助于更新密钥)

【讨论】:

以上是关于Android:使用 ArrayList 从 Firebase 检索对象的主要内容,如果未能解决你的问题,请参考以下文章

Android Wi-Fi Direct P2P 将数据从服务器发送到客户端

如何从 Android 中 ArrayAdapter 上的 ArrayList 更新项目

从 JSONArray 转换为 ArrayList<CustomObject> - Android

从android中的数据库读取到arraylist

如何从Android中的arraylist中删除重复值[重复]

如何从整数arraylist.ANDROID中删除值[重复]