Для циклических запросов в Firebase - PullRequest
0 голосов
/ 19 декабря 2018

У меня есть этот код, и моя цель - отправить сообщение моим получателям, например, по электронной почте (Cc), но оно не зацикливается, у меня есть 2 получателя, но я могу отправить сообщение только первому.

DatabaseReference emailReference = firebaseDatabase.getReference(STUDENTS);
DatabaseReference carbonCopyReference = firebaseDatabase.getReference(STUDENTS);
emailReference.keepSynced(true);
carbonCopyReference.keepSynced(true);
List<String> carbonUids = new ArrayList<>();
carbonUids.clear();

for (int i = 0, emailsSize = emails.size(); i < emailsSize; i++) {

    String email = emails.get(i);
    Log.d("interactor--emails", email);
    Query emailQuery = emailReference.orderByChild("email").startAt(email).endAt(email+UF8FF);
    emailQuery.keepSynced(true);

    emailQuery.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

            for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
                carbonUids.add(snapshot.getKey());
                Log.d("interactor--carbonKey", String.valueOf(carbonUids));
                for (String carbonUid : carbonUids) {

                    carbonCopyReference.child(carbonUid).child(CONSULTATION_REQUESTS).push().setValue(response);
                }
            }
        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {
            listener.onFailure(databaseError.getMessage());
        }
    });
    if (i == (emails.size()-1)){
        listener.onSuccess("Request Sent");
        context.startActivity(new Intent(context, ConsultDepartmentsActivity.class));
        ((Activity) context).finish();
        ((Activity) context).overridePendingTransition(R.anim.slide_in_left, R.anim.slide_out_right);
    }
}

2 записи у первого получателя, в то время как вторая запись не отправляется.(У меня до сих пор нет 10 пунктов репутации для публикации изображений)

2 записи у первого получателя -

2 records in first recipient

Ребенок с открытыми данными, такими как электронная почта, имя fNameмои целевые получатели

Ребенок с открытыми данными (электронная почта, имя, фамилия) -

Child with open details (email, fName, lastName)

Я видел этот код, но я не знаю, как я могсделать это на Java.Это возможно или выполнимо в Java по крайней мере?

for (var each = 0; each < alumAroundId.length; each++) { 
console.log("outside of rootRef", each); 
(function(each){ rootRef.child('users').child(alumAroundId[each].key).once('value', function (eventSnap) 
{ 
console.log(each, "inside the rootRef is off"); var thisUser = eventSnap.val(); thisUser.distance = alumAroundId[each].distance; $scope.allAlumAround.push(thisUser); 
}); 
})(each); 
}

Ответы [ 2 ]

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

Я заметил в своем списке, что во втором элементе электронной почты есть пробелы.Я должен добавить .trim() к email строковой переменной для кода запроса, читать каждое письмо внутри цикла for.

Наконец, это сработало после добавления trim () к строке письма

Вот рабочий код

for (int i = 0; i < emails.size(); i++) {
 String email = emails.get(i);
 Log.d("interactor--email", email.trim());
 Log.d("interactor--last-emails", String.valueOf(emails).trim());

 queryReference(emailReference, carbonCopyReference, email.trim(), response, listener);
}

private void queryReference( DatabaseReference emailReference, DatabaseReference carbonCopyReference, String email, ConsultationResponse response, SendingMessageListener listener) {
    emailReference.orderByChild("email").equalTo(email).addChildEventListener(new ChildEventListener() { //.startAt(classmateEmails[i]).endAt(classmateEmails[i]+UF8FF)
        @Override
        public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
            Log.d("interactor--snapshotKey", dataSnapshot.getKey());
            List<String> carbonUids = new ArrayList<>();
            carbonUids.add(dataSnapshot.getKey());
            Log.d("interactor--emailSnap", email);

            Log.d("interactor--carbonKey1", String.valueOf(carbonUids));
            Log.d("interactor--carbonSize1", String.valueOf(carbonUids.size()));

            for (int i = 0; i < carbonUids.size(); i++) {
                String carbonUid = carbonUids.get(i);
                Log.d("interactor--carbonLoop", carbonUid);
                carbonCopyReference.child(carbonUid).child(CONSULTATION_REQUESTS).push().setValue(response);
                if (i == (carbonUids.size() - 1)) { //i == (emails.size() - 1)
                    Log.d("interactor--finishLoop", "Loop finished.");
                    listener.onSuccess("Request Sent");
                    context.startActivity(new Intent(context, ConsultDepartmentsActivity.class));
                    ((Activity) context).finish();
                    ((Activity) context).overridePendingTransition(R.anim.slide_in_left, R.anim.slide_out_right);
                }
            }
        }

        @Override
        public void onChildChanged(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {

        }

        @Override
        public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) {

        }

        @Override
        public void onChildMoved(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {

        }

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

        }
    });

}

Данные добавлены получателям.Yaaay!(У меня еще нет 10 очков репутации, пожалуйста, потерпите меня)

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

Проблема в вашем коде в том, что вы перебираете список carbonUids, добавляя элементы в тот же список.Чтобы решить эту проблему, вам нужно получить цикл for из другого цикла for следующим образом:

emailQuery.addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
            carbonUids.add(snapshot.getKey());
            Log.d("interactor--carbonKey", String.valueOf(carbonUids));

        }

        for (String carbonUid : carbonUids) {
            carbonCopyReference.child(carbonUid).child(CONSULTATION_REQUESTS).push().setValue(response);
        }
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
        listener.onFailure(databaseError.getMessage());
    }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...