Firebase dataSnapshot.getValue(Subclass.class)函数从不返回

时间:2019-03-23 08:17:02

标签: java firebase firebase-realtime-database

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

卖方和客户是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检索子类项?

1 个答案:

答案 0 :(得分:0)

[已解决]

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