我正在使用recylerviews和Firebase。我正在使用FirebaseUI将数据填充到我的recyclerview。我想知道是否可以在我的片段中使用两个查询。应该执行的查询应该取决于数据库中是否存在节点。
数据库结构:
如果用户节点中存在地址子节点,则我的片段应查询用户节点。如果不是,它应该查询路由节点。这可能吗?
基本上我在这里通过查询来获取所有标记:
// Ref: https://github.com/erikras/react-redux-universal-hot-example/issues/962#issuecomment-219354496
export const removeByKey = (object, deleteKey) => {
return Object.keys(object)
.filter(key => key !== deleteKey)
.reduce((result, current) => {
result[current] = object[current];
return result;
}, {});
};
case types.REMOVE_ITEM:
return { ...state, cartData: deleteKey(cartData, action.payload)) }
在我的onBindViewHolder方法中,我对recyclerview中的每个项目都有一个onClick。单击该项目后,用户将转到新活动。在这个新活动中,用户可以按下一个按钮,该按钮将在users / userId节点下添加地址节点。按下该按钮意味着用户已选择该标记。所以我只想在recyclerview中显示标记信息,而不是在数据库中显示每个标记。
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();
我在想:如果在用户节点中插入了地址和时间节点,我可以查询一下,这样可以更轻松。
答案 0 :(得分:3)
这是可能的,虽然我认为您首先需要检查用户是否选择了标记,然后决定要附加到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
来自sharedPreferences.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
,并且可以使用单独的视图来显示有关用户所选内容的详细信息标记