Firebase / Android Studio: Как проверить подстроку в данных Firebase? - PullRequest
0 голосов
/ 27 апреля 2020

У меня есть два узла в моей базе данных. Один называется JOBS, а другой - USERS. Я хочу получить все задания, которые имеют тот же job_type , что и пользователи job_interests . Например, в этом случае пользователь Willow интересуется работой по уходу за питомцами и обучению. Я хочу, чтобы рабочие места, которые имеют тип Уход за домашними животными или обучение, были извлечены. В этом случае задание 1.

Это мой Узел задания:

enter image description here

Это мой Пользовательский узел:

enter image description here

Исходя из моих исследований, это возможно с использованием startAt и endAt функций. Я попробовал приведенный ниже код. Однако на экране ничего не отображается. Я новичок в android и firebase, так что я не уверен, что то, что я делаю, правильно. Помощь приветствуется, спасибо.

package com.example.oddsynew;

import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.Query;
import com.google.firebase.database.ValueEventListener;

import java.util.ArrayList;

public class RecommendedFragment extends Fragment {
    DatabaseReference usersRef, jobsRef;
    FirebaseAuth mAuth;
    RecyclerView nearYouList;
    ArrayList<Job> list;
    HomeAdapter adapter;
    Query query;
    FirebaseUser u;
    String userID, jobinterests, jobtype;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_recommended, container, false);
    }

    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);


        mAuth = FirebaseAuth.getInstance();
        u = mAuth.getCurrentUser();
        userID = u.getUid();
        usersRef = FirebaseDatabase.getInstance().getReference("Users").child(userID);
        jobsRef = FirebaseDatabase.getInstance().getReference("Jobs");

        nearYouList = (RecyclerView) view.findViewById(R.id.nearYou);
        nearYouList.setLayoutManager(new LinearLayoutManager(getActivity()));
        list = new ArrayList<Job>();

        adapter = new HomeAdapter(getActivity(), list);
        nearYouList.setAdapter(adapter);

        try {
            jobsRef.addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                    for (DataSnapshot ds : dataSnapshot.getChildren()) {
                        jobtype = ds.child("job_type").getValue(String.class);
                        Log.e("TAG", " " + jobtype);

                        query = usersRef.orderByChild("job_interests").startAt(jobtype).endAt(jobtype + "/uf8ff");
                        query.addValueEventListener(new ValueEventListener() {
                            @Override
                            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                                if (dataSnapshot.exists()) {
                                    for (DataSnapshot ds : dataSnapshot.getChildren()) {
                                        Job j = ds.getValue(Job.class);
                                        list.add(j);
                                        System.out.println(list);
                                    }
                                    adapter.notifyDataSetChanged();
                                }
                            }

                            @Override
                            public void onCancelled(@NonNull DatabaseError databaseError) {

                            }
                        });
                    }
                    Log.e("TAG", "LOL" + query);
                }

                @Override
                public void onCancelled(@NonNull DatabaseError databaseError) {

                }
            });
        } catch (IndexOutOfBoundsException e) {
            e.printStackTrace();
        }

1 Ответ

0 голосов
/ 27 апреля 2020

Я бы создал узел БД 'jobsOfType', содержащий все типы заданий. Под каждым типом работы я бы перечислил работы этого типа. Тогда легко получить все задания определенного типа c.

Альтернативой этому может быть использование типа задания в качестве первой части ключа задания, например. 'Pet CareJob1', вы можете затем использовать startAt endAt на ключе, чтобы получить все вакансии по типу работы. Однако использование пробелов в ключе не рекомендуется. Если вы go этот маршрут, то я бы использовал конкретные коды c для определения типов заданий, а не строки «свободный текст». Это применимо в качестве общего комментария, поэтому вам, вероятно, следует реализовать коды для идентификаторов типов заданий.

На узле «Пользователь» я буду хранить типы заданий, которые интересуют пользователя, в виде списка / массива. Затем, когда вы читаете запись пользователя, вы перебираете массив и для каждой записи вы читаете узел 'jobsOfType', чтобы получить список заданий этого типа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...