Firebase: OrderbyChild на ссылочном узле, возвращает NULL снимок в onDataChange - PullRequest
0 голосов
/ 27 декабря 2018

Я пытаюсь вызвать oderByChild на узле ref с датой как вложенным элементом.В нем говорится:

paymentIDs-> userIDXX1-> orderID-> date: «1254785xxxx», возвращают NULL в onDatechange() .indexOn: дата также предоставляется на узле paymentIDs

mFirebaseDatabase = FirebaseDatabase.getInstance();

Query listpayment = mFirebaseDatabase.getReference("paymentIDs").orderByChild("date").startAt(fromdateinLong).endAt(todateinLong);

listpayment.addListenerForSingleValueEvent(valueEventListener);

ValueEventListener valueEventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {

        Log.e(TAG,"valueEventListener: OnDatachanged" );
        if (dataSnapshot.exists()) {
//if not null, do something.
            }

        }
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {
        Log.e(TAG,"valueEventListener: OnCancelled" );
    }
};

enter image description here

1 Ответ

0 голосов
/ 27 декабря 2018

Вы получаете null, потому что вам не хватает ребенка, который является идентификатором пользователя.Чтобы решить эту проблему, измените следующую строку кода:

Query listpayment = mFirebaseDatabase.getReference("paymentIDs").orderByChild("date").startAt(fromdateinLong).endAt(todateinLong);

на

String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
Query listpayment = mFirebaseDatabase.getReference()
    .child("paymentIDs")
    .child(uid)
    .orderByChild("date")
    .startAt(fromdateinLong).endAt(todateinLong);
ValueEventListener valueEventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for(DataSnapshot ds : dataSnapshot.getChildren()) {
            String userId = ds.child("userId").getValue(String.class);
            Log.d(TAG, userId);
        }
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
        Log.d(TAG, databaseError.getMessage()); //Don't ignore errors!
    }
};
listpayment.addListenerForSingleValueEvent(valueEventListener);

Редактировать:

Согласно вашим комментариям,Вы должны знать, что, используя эту схему базы данных, вы не сможете получить все платежи от всех пользователей.В Firebase нет возможности использовать подстановочные знаки.Так что запрос вроде этого:

Query listpayment = mFirebaseDatabase.getReference()
.child("paymentIDs")
.child(?)
.orderByChild("date")
.startAt(fromdateinLong).endAt(todateinLong);

Не разрешен.Чтобы решить эту проблему, существует обходной путь, который подразумевает дублирование данных.Таким образом, вы должны создать еще один узел, в который вы должны добавить все платежи всех пользователей.Эта практика называется denormalization и является обычной практикой, когда дело доходит до Firebase.Для лучшего понимания, я рекомендую вам посмотреть это видео, Денормализация нормальна с базой данных Firebase .

Также, когда вы дублируете данные, есть одна вещь, которую нужно иметь в виду,Точно так же, как вы добавляете данные, вы должны поддерживать их.Другими словами, если вы хотите обновить / обнаружить элемент, вы должны делать это в каждом месте, где он существует.

Так что, к сожалению, используя реальную структуру базы данных, вы не можете достичь того, чего хотите.

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