在Firebase回收器视图中检索孩子的孩子

时间:2019-01-30 14:34:46

标签: java android firebase firebase-realtime-database

在Firebase回收器视图中获取孩子“ sonyTV”。

问题:这个孩子不是“用户”的直接孩子

My database

输入名称和日期,但不输入“ sonyTV”

  @Override
        protected void onBindViewHolder(@NonNull UsersViewHolder usersViewHolder, int i, @NonNull ALL_USERS all_users) {
            usersViewHolder.setName(all_users.getName());
            usersViewHolder.setDate(all_users.getDate());
            usersViewHolder.setUserSoldItems(all_users.getUserSoldItems());

setUserSoldItems方法

   public void setUserSoldItems(ALL_USERS.UserSoldItems userSoldItems) {

            TextView SonyTvView = mView.findViewById(R.id.showTVsony);
            SonyTvView.setText("Sony TV : "+userSoldItems);
        }

ALL_USERS类

public class ALL_USERS {
    private String name;
    private long date;
    private UserSoldItems userSoldItems;



    public ALL_USERS() {}

    public ALL_USERS(String name, long date, UserSoldItems userSoldItems) {
        this.name = name;
        this.date = date;
        this.userSoldItems = userSoldItems;

    }


    public String getName() { return name; }
    public long getDate() { return date; }
    public UserSoldItems getUserSoldItems() { return userSoldItems; }

    public class UserSoldItems {

        private long sonyTV;

        public UserSoldItems() {}

        public UserSoldItems(long sonyTV) {
            this.sonyTV = sonyTV;
        }

        public long getSonyTV() { return sonyTV; }
    }
}

但是它给我空值,尽管您可以在我的数据库中检查它不是空值

这就是我发给孩子(“ sonyTV”)的方式

 users.child(user.getUid()).child("UserSoldItems").child("sonyTV").runTransaction(new Transaction.Handler() {
                @NonNull
                @Override
                public Transaction.Result doTransaction(@NonNull MutableData mutableData) {
                    Long value = mutableData.getValue(Long.class);
                    if (value == null) {
                        mutableData.setValue(0);
                    }
                    else {
                        mutableData.setValue(value + 1);
                    }

                    return Transaction.success(mutableData);
                }



                @Override
                public void onComplete(DatabaseError databaseError, boolean b,
                                       DataSnapshot dataSnapshot) {
                }
            });

1 个答案:

答案 0 :(得分:0)

根据您的问题:

  

亲爱的亚历克斯,我还有另一件事我无法在RecyclerView中获得子sonyTV,是因为它不是Users节点的直接子对象?? !!!

现在看到您要实现的目标,我想到的最简单的解决方案是在您的UserSoldItems类中添加类型为User的额外属性。因此,您的User类应如下所示:

public class ALL_USERS {
    private String name;
    private long date;
    private UserSoldItems userSoldItems;

    public ALL_USERS() {}

    public ALL_USERS(String name, long date, UserSoldItems userSoldItems) {
        this.name = name;
        this.date = date;
        this.userSoldItems = userSoldItems;
    }

    public String getName() { return name; }
    public long getDate() { return date; }
    public UserSoldItems getUserSoldItems { return userSoldItems; }
}

UserSoldItems应该看起来像这样:

public UserSoldItems {
    private long sonyTV;

    public UserSoldItems() {}

    public UserSoldItems(int sonyTV) {
        this.sonyTV = sonyTV;
    }

    public long getSonyTV() { return sonyTV; }
}

或更简单:

public UserSoldItems {
    public long sonyTV;
}

请注意,节点的名称应为UserSoldItems User Sold Items,以使其起作用。因此,不应包含任何空格。因此,添加数据时,请不要添加任何空格。最后,只需从数据库中清除实际数据并添加新数据即可。

因此,我们在JSON树中引入了新的UserSoldItems级别,因此我们可以确保Java类对此进行反映。