Android-对recyclerview(Firebase)的多个查询
我与RecylerView和Firebase合作。我正在使用FirebaseUI将数据填充到我的recyclerview中。我想知道是否可以在我的片段中使用两个查询。应执行的查询应取决于数据库中是否存在节点 数据库结构: 如果地址子节点出现在用户节点中,我的片段应该查询用户节点。如果不是,它应该查询routes节点。这可能吗 基本上,我在这里通过查询获得所有标记:Android-对recyclerview(Firebase)的多个查询,android,firebase,firebase-realtime-database,Android,Firebase,Firebase Realtime Database,我与RecylerView和Firebase合作。我正在使用FirebaseUI将数据填充到我的recyclerview中。我想知道是否可以在我的片段中使用两个查询。应执行的查询应取决于数据库中是否存在节点 数据库结构: 如果地址子节点出现在用户节点中,我的片段应该查询用户节点。如果不是,它应该查询routes节点。这可能吗 基本上,我在这里通过查询获得所有标记: Query keyQuery = FirebaseDatabase.getInstance().getReference(shar
Query keyQuery = FirebaseDatabase.getInstance().getReference(sharedPreferences.getString("school", null)).child("markers");
recyclerView = (RecyclerView) rootView.findViewById(R.id.markerRecyclerview);
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
FirebaseRecyclerOptions<FirebaseMarker> options = new FirebaseRecyclerOptions.Builder<FirebaseMarker>()
.setQuery(keyQuery, FirebaseMarker.class)
.build();
我在想:如果在用户节点中插入一个地址和时间节点,我就可以查询它,这样会更简单。这是可能的,尽管我认为您首先需要检查用户是否选择了标记,然后决定将哪个查询附加到
FirebaseRecyclerAdapter
为此,可能需要添加已在标记节点下选择每个标记的用户列表,如:
users
userId
selectedMarker // the ID of the marker selected by this user
...
markers
markerId
...
selectedUsers // list of user IDs that have selected this marker
然后,如果users
节点包含selectedMarker
值,则可以使用以下查询获取此特定用户选择的所有标记:
Query query = FirebaseDatabase.getInstance().getReference()
.child(schoolId).child("markers")
.orderByChild("selectedUsers/"+userId).equalTo(true);
其中schoolId
来自您的SharedReferences。getString(“school”,null)
和userId
是当前登录用户的唯一ID
要检查用户是否选择了标记,可以简单地执行以下操作:
FirebaseDatabase.getInstance().getReference()
.child(schoolId).child("users").child(userId)
.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if (dataSnapshot.child("selectedMarker").exists()) {
// Attach above query to FirebaseRecyclerAdapter
} else {
// Attach markers reference (no query) to FirebaseRecyclerAdapter
}
}
@Override
public void onCancelled(DatabaseError databaseError) {}
});
但是,如果您只想显示用户选定的单个标记,则可能根本不需要使用
RecyclerView
,只需使用单独的视图来显示用户选定标记的详细信息。,根据当前用户的节点下是否存在地址
,是否要将不同的查询附加到FirebaseRecyclerAdapter
?你能提供一些例子代码说明在哪里会发生这种情况吗?您应该可以使用不同的FirebaseRecyclerOptions
实例初始化适配器。我已经更新了我的帖子。这有意义吗?你认为可能吗?谢谢你的回答。您的最后一点似乎是正确的,因为我只需要显示用户的单个选定标记。我想使用recylerview
来显示所有标记,如果用户节点下存在address
节点,则只显示一个单独的文本视图。我遇到的问题是,当在if else
语句中运行数据库引用时,它没有正确执行。。我就是这样做的。我犯了什么错误吗。我的屏幕只显示了一个填充的行,没有数据。这看起来不错,但您需要记住,onDataChange()
是异步的,因此如果您还没有调用,FirebaseRecyclerOptions
设置代码,则需要在该块中调用else语句中的设置代码?这一切都是用同样的方法完成的
FirebaseDatabase.getInstance().getReference()
.child(schoolId).child("users").child(userId)
.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if (dataSnapshot.child("selectedMarker").exists()) {
// Attach above query to FirebaseRecyclerAdapter
} else {
// Attach markers reference (no query) to FirebaseRecyclerAdapter
}
}
@Override
public void onCancelled(DatabaseError databaseError) {}
});