使用FirebaseDatabase连接两个子节点

时间:2019-07-19 08:32:06

标签: android firebase firebase-realtime-database data-structures

我开始使用Firebase Realtime Database,并且对我的数据结构有疑问。 请参阅下面的当前数据库:

enter image description here

我已为设备订购了OS子级产品,以便按OS进行过滤,只得到想要的子级产品。

但是在过滤之前,我想用合并在一起的所有子项填充我的RecyclerView。

  • MacBook Pro
  • Mac Pro
  • iPhone XS

如果我做FirebaseDatabase.getReference(DEVICES),我将拥有所有数据,但不匹配Java对象。 如果我执行FirebaseDatabase.getReference(DEVICES).child(macOS),则可以使用,但是列表中只有macOS设备。

有什么办法可以“加入”

FirebaseDatabase.getReference(DEVICES).child(macOS)
FirebaseDatabase.getReference(DEVICES).child(iOS)
...

在一个DatabaseReference中?

此外,我使用Firebase UI来将数据绑定到我的RecyclerView

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    devices = FishApp.getDatabase().getReference(Constants.DEVICES);
    devices.keepSynced(true);
    setHasOptionsMenu(true);

}

@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_devices, container, false);
    ButterKnife.bind(this, view);
    mAdapter = new FirebaseDeviceAdapter(getActivity(), Device.class, R.layout.item_device, DeviceHolder.class, devices);
    return view;
}

编辑:添加了Java代码和数据库屏幕截图

1 个答案:

答案 0 :(得分:0)

一种快速的方法是监视/捕获 DEVICES 节点,然后遍历其子节点。这样,您可以访问所有孩子并检索所需的孩子。这是一个例子。

DatabaseReference db = FirebaseDatabase.getInstance().getReference().child("DEVICES");

db.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

            // test for null and validity
            if (dataSnapshot.exists() && dataSnapshot.getValue() != null) {

                // loop through all the immediate children
                for (DataSnapshot snapshot : dataSnapshot.getChildren()) {

                    // This gets all the children of the mac node
                    if ("macOS".equals(snapshot.getKey())) {
                        for (DataSnapshot dataSnapshot1 : snapshot.getChildren()) {
                            // Retrieve individual values of the macOS node
                        }
                    }
                    // This gets all the children of the windows node
                    else if ("windows".equals(snapshot.getKey())) {
                        for (DataSnapshot dataSnapshot1 : snapshot.getChildren()) {
                            // Retrieve individual values of the windows node
                        }
                    }
                    // This gets all the children of the iOS node
                    else if ("iOS".equals(snapshot.getKey())) {
                        for (DataSnapshot dataSnapshot1 : snapshot.getChildren()) {
                            // Retrieve individual values of the iOS node
                        }
                    }
                }

            }
        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {
            // handle cancel event
        }
    });

我希望这会有所帮助。快活的编码!