Android - 对recyclerview的多个查询(Firebase)

时间:2017-11-07 10:50:35

标签: android firebase firebase-realtime-database

我正在使用recylerviews和Firebase。我正在使用FirebaseUI将数据填充到我的recyclerview。我想知道是否可以在我的片段中使用两个查询。应该执行的查询应该取决于数据库中是否存在节点。

数据库结构:

enter image description here

如果用户节点中存在地址子节点,则我的片段应查询用户节点。如果不是,它应该查询路由节点。这可能吗?

基本上我在这里通过查询来获取所有标记:

// 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();

我在想:如果在用户节点中插入了地址时间节点,我可以查询一下,这样可以更轻松。

1 个答案:

答案 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,并且可以使用单独的视图来显示有关用户所选内容的详细信息标记