我在调用数据库时使用FirebaseRecyclerOptions
,但是,我无法获取数据库中的所有数据。这是数据库的结构:数据库结构黄色下划线是用户id(UID(,下面是另一个节点,它包含我想在RecyclerView中检索的数据。
这是代码的一个片段
FirebaseRecyclerOptions<RegisterParking> options =
new FirebaseRecyclerOptions.Builder<RegisterParking>()
.setQuery(FirebaseDatabase.getInstance().getReference().child("RegParkingArea"), RegisterParking.class)
.build();
voPListAdapter = new VoPListAdapter(options);
recyclerView.setAdapter(voPListAdapter);
当您将以下两个参数传递给setQuery((方法时:
.setQuery(FirebaseDatabase.getInstance().getReference().child("RegParkingArea"), RegisterParking.class)
这意味着适配器希望在屏幕上呈现RegisterParking
对象。如果仔细查看数据库模式,在RegParkingArea
节点下,可以找到UID和而不是RegisterParking
对象。要在RecycerView中显示的对象存在于每个UID下。因此,当从数据库中读取数据时,Firebase UI库会尝试将上述引用下的每个子对象映射到RegisterParking
类型的对象中,这实际上是不可能的,因为UID是字符串。
因此,如果允许您更改数据库模式,那么您应该取消数据的规范化,基本上是将数据复制到另一个节点下,或者将实际数据更改为:
db-root
|
--- RegParkingArea
|
--- $pushedId
|
--- uid: "4u9h...XrP2"
|
--- //other fields.
基本上,我已经从数据库树中删除了一个级别。如果您将使用这个模式,那么您可以保持代码的原样,一切都会很好地工作。
还有一件事需要注意,如果你需要获得特定用户的所有停车位,那么你可以使用以下查询:
DatabaseReference db = FirebaseDatabase.getInstance().getReference();
Query queryByUid = db.child("RegParkingArea").orderByChild("uid").equalTo(uid);