Возникла проблема с поиском детей по ключу в базе данных Firebase для Android - PullRequest
0 голосов
/ 21 марта 2019

Я предполагаю, что у меня есть пердеж мозга с FB DB при создании отслеживания поступления топлива для пользователей приложений.У меня есть текущая структура базы данных ..

enter image description here

Иерархия: "уплотнения / идентификатор пользователя / населенного пункта / топливо".Цель состоит в том, чтобы вернуть всех детей под ключом «топливо» любого данного населенного пункта для этого пользователя.В будущем появятся другие записи, не связанные с топливом, но с тем же идентификатором урегулирования.

Вот мой valueEventListener для извлечения данных ..

public class FragmentFuel extends Fragment {
    private ArrayList<Fuel> fuel = new ArrayList<>();
    private Context context;
    private MI MI;
    private RecyclerView.Adapter recyclerAdapter = new recyclerAdapter();
    private ValueEventListener valueEventListener;
    private DatabaseReference reference;
    //private DecimalFormat usdFormat = new DecimalFormat("#.00");

    public FragmentFuel() {
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        valueEventListener = new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                Logger.i(dataSnapshot.getRef().toString());
                Logger.i("COUNT " + dataSnapshot.getChildrenCount());
                fuel.clear();
                for (DataSnapshot child : dataSnapshot.getChildren()) {
                    fuel.add(child.getValue(Fuel.class));
                }
                recyclerAdapter.notifyDataSetChanged();
            }

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

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.fragment_fuel, container, false);
        RecyclerView recyclerView = v.findViewById(R.id.recycler);
        recyclerView.setHasFixedSize(true);
        recyclerView.setLayoutManager(new LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false));
        recyclerView.setAdapter(recyclerAdapter);
        return v;
    }

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        this.context = context;
        MI = (MI) getActivity();
    }

    @Override
    public void onStart() {
        super.onStart();
        if (MI != null) {
            reference = MI.getReference().child("settlements").child(MI.getUID()).child(MI.getSID()).child("fuel");
            reference.addValueEventListener(valueEventListener);
        }
    }

    @Override
    public void onStop() {
        super.onStop();
        reference.removeEventListener(valueEventListener);
    }

    @Override
    public void onDetach() {
        super.onDetach();
        MI = null;
    }

    private class recyclerAdapter extends RecyclerView.Adapter<recyclerAdapter.viewHolder> {
        @Override
        public viewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            return new viewHolder(getLayoutInflater().inflate(R.layout.fuel_row, parent, false));
        }

        @Override
        public void onBindViewHolder(viewHolder holder, int position) {
            Fuel row = fuel.get(position);
            holder.date.setText(TimeConvert.toDateAndTime(row.getStamp()));
            holder.cost.setText("$" + formatInt(row.getCost()));
            holder.odometer.setText("odometer: " + formatInt(row.getOdometer()));
            holder.gallons.setText(formatInt(row.getGallons()) + " gallons");
            if (row.getNote().equals("")) holder.note.setVisibility(View.GONE);
            else holder.note.setVisibility(View.VISIBLE);
            holder.note.setText(row.getNote());
        }

        @Override
        public int getItemCount() {
            return fuel.size();
        }

        class viewHolder extends RecyclerView.ViewHolder {
            TextView date, cost, odometer, gallons, note;

            viewHolder(View itemView) {
                super(itemView);
                date = itemView.findViewById(R.id.date);
                cost = itemView.findViewById(R.id.cost);
                odometer = itemView.findViewById(R.id.odometer);
                gallons = itemView.findViewById(R.id.gallons);
                note = itemView.findViewById(R.id.note);
            }
        }
    }

    private String formatInt(int count) {
        return NumberFormat.getNumberInstance(Locale.US).format(count);
    }
}

Мой вывод журнала показывает, что OnDataChanged вызываетсяправильно, но getChildCount () возвращает значение 0. Ссылочный путь верен и должен возвращать 4 детей.

enter image description here

Надеюсь, кто-нибудь увидит, что я 'мы пропустили.

1 Ответ

0 голосов
/ 21 марта 2019

Проблема была в ошибке пути ссылки.Вы заметите, что в данных для расчета было указано значение "-LaSu7s73QvpfeE6D3TS", но в пути регистрации не было тире "-".

"LaSu7s73QvpfeE6D3TS" должно быть "-LaSu7s73QvpfeE6D3TS" * 1003

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