Невозможно отфильтровать запрос с несколькими предложениями, используя базу данных Firebase Realtime - PullRequest
0 голосов
/ 20 мая 2018

Я использую базу данных Firebase Realtime с пользовательским интерфейсом Firebase, однако я не могу выполнять поиск по нескольким предложениям.

Мне нужно взять пользователей, которые не имеют определенного идентификатора.Поскольку я уже фильтрую их по городам, мне нужно отфильтровать их с определенным идентификатором.Я пытался решить ее разными способами, однако ни один из них не увенчался успехом.

Это моя база данных

enter image description here

Я не могу взять и сделать карту с пользователем с таким именем пользователя.

public class SearchFragment extends android.support.v4.app.Fragment {


    private EditText mSearchField;
    private ImageButton mSearchBtn;
    private RecyclerView mResultList;
    private DatabaseReference mUserDatabase;

    public static SearchFragment newInstance() { return new SearchFragment();  }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View view = inflater.inflate(R.layout.fragment_search, container, false);
        mSearchField = view.findViewById(R.id.search_field);
        mSearchBtn = view.findViewById(R.id.search_btn);

        mResultList = view.findViewById(R.id.result_list);
        mResultList.setHasFixedSize(true);
        mResultList.setLayoutManager(new LinearLayoutManager(mResultList.getContext()));

        mSearchBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                String searchText = mSearchField.getText().toString();
                firebaseUserSearch(searchText);
                mSearchField.setText("");
            }
        });

        mUserDatabase = FirebaseDatabase.getInstance().getReference("usuarios");
        return view;
    }

    public void firebaseUserSearch(String searchText) {
        Toast.makeText(getContext(), "Buscando usuários", Toast.LENGTH_LONG).show();

        String searchTextLower = searchText.toLowerCase();

        final Query firebaseSearchQuery = mUserDatabase.orderByChild("city").startAt(searchTextLower).endAt(searchTextLower + "\uf8ff");

        firebaseSearchQuery.addChildEventListener(new ChildEventListener() {
            @Override
            public void onChildAdded(DataSnapshot dataSnapshot, String s) {
                GenericTypeIndicator<Map<String, String>> genericTypeIndicator = new GenericTypeIndicator<Map<String, String>>() {};
                Map<String, String> map = dataSnapshot.getValue(genericTypeIndicator );
                String username = map.get("username").toString();
                Log.d("oi", username);
                Log.d("olar", UserDetails.username);

                if(username != UserDetails.username) {
                    final FirebaseRecyclerOptions<User> options =
                            new FirebaseRecyclerOptions.Builder<User>()
                                    .setQuery(firebaseSearchQuery, User.class)
                                    .build();
                    bindAndBuildFirebaseUi(options);
                }
            }



    public void bindAndBuildFirebaseUi(FirebaseRecyclerOptions options) {
        final FirebaseRecyclerAdapter<User, UsersViewHolder> firebaseRecyclerAdapter = new FirebaseRecyclerAdapter<User, UsersViewHolder>(options) {
            @Override
            public UsersViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
                View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_layout, parent, false);
                return new UsersViewHolder(v);
            }

            @Override
            protected void onBindViewHolder(final UsersViewHolder holder, int position, final User model) {
                holder.bind(model);
                Log.d("SearchFragment", "Binded the model");
                holder.itemView.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        UserDetails.chatWithId = model.getUsername();
                        UserDetails.chatWith = model.getName();
                        startActivity(new Intent(getContext(), Chat.class));
                    }
                });
            }
        };
        firebaseRecyclerAdapter.startListening();
        mResultList.setAdapter(firebaseRecyclerAdapter);
    }
}

Как вы можете видеть, я даже пытался отфильтровать их через базу данных снова, однако Firebase ui берет фильтр из опций, который является первым запросом, фильтрующим пользователей по городам.

Есть ли у кого-нибудь идеи, как избежать рендеринга пользователей с определенным идентификатором ???

И я также знаю, что Firebase не позволяет использовать более одного orderBy.

1 Ответ

0 голосов
/ 21 мая 2018

Firebase RTDB , к сожалению, не поддерживает несколько операторов where.Однако, если вы денормализуете свои данные должным образом, вы можете использовать один запрос для ссылки на другую ссылку в базе данных и эффективно фильтровать данные таким образом.Взгляните на документы: https://github.com/firebase/FirebaseUI-Android/blob/master/database/README.md#using-firebaseui-with-indexed-data.

В качестве примечания: вам действительно не следует использовать RTDB для хранения фактических данных, поскольку они не масштабируются.Он предназначен для обновлений в режиме реального времени с малой задержкой для многопользовательской игры, приложения для продажи билетов и т. Д. Вместо этого я бы рекомендовал изучить Firestore , особенно если это новое приложение.

ВотВзлом я упомянул в своем комментарии ниже:

public class MyAdapter extends FirebaseRecyclerAdapter {
    private static final int TYPE_NORMAL = 0;
    private static final int TYPE_HIDDEN = 1;

    private final View mEmpty = new View(getContext());

    public MyAdapter(@NonNull FirestoreRecyclerOptions options) {
        super(options);
        mEmpty.setVisibility(View.GONE);
    }

    @Override
    public int getItemViewType(int position) {
        if (getItem(position).username.equals(UserDetails.username)) {
            return TYPE_HIDDEN;
        } else {
            return TYPE_NORMAL;
        }
    }

    @Override
    public UsersViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        if (viewType == TYPE_HIDDEN) {
            return new UsersViewHolder(mEmpty);
        }

        View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_layout, parent, false);
        return new UsersViewHolder(v);
    }

    @Override
    protected void onBindViewHolder(final UsersViewHolder holder, int position, final User model) {
        if (getItemViewType(position) == TYPE_HIDDEN) return;

        holder.bind(model);
        Log.d("SearchFragment", "Binded the model");
        holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                UserDetails.chatWithId = model.getUsername();
                UserDetails.chatWith = model.getName();
                startActivity(new Intent(getContext(), Chat.class));
            }
        });
    }
}
...