首页 > 解决方案 > Firebase dataSnapshot.getValue(Subclass.class) 函数永远不会返回

问题描述

我正在尝试从 Firebase 为“卖家”和“客户”的“用户”的两个不同孩子获取价值。这些孩子也有卖家或客户的 ID。

Seller 和 Customer 是 User 类的子类,我已经实现了所有的 setter 和 getter。这是我无法从数据库中获取值的代码:

public class DatabaseWrapper {

    private final static DatabaseReference ref = FirebaseDatabase.getInstance().getReference();
    private final static DatabaseReference usersRef = ref.child("users");
    private final static DatabaseReference productsRef = ref.child("products");
    private static Object retrieverObject = null;

    public static User getUser(String type, String id) throws InterruptedException {
        CountDownLatch done = new CountDownLatch(1);
        usersRef.child(type).child(id).addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                    //Never returns getValue(Subclass.class)
                    if (type.equals("customers"))
                        retrieverObject = dataSnapshot.getValue(Customer.class);
                    else
                        retrieverObject = dataSnapshot.getValue(Seller.class);
                done.countDown();
            }
            @Override
            public void onCancelled(DatabaseError databaseError) {
              System.out.println("The read failed: " + databaseError.getCode());
            }
          });
        done.await();
        return (User)retrieverObject;

    }

我故意让它同步代码以查看问题。如果我使用getValue(User.class)而不是它可以工作getValue(Customer.class)getValue(Seller.class)但这种用法显然不会获得子类中的字段。所以问题是如何从 Firebase 检索子类项目?

标签: javafirebasefirebase-realtime-database

解决方案


[解决了]

谁有类似的问题是从 Firebase 反序列化对象,不要忘记编写一个空的构造函数。我只有带参数的构造函数,然后我向子类添加了空参数构造函数,它起作用了。


推荐阅读