Переместить данные в базе данных Firebase Realtime на Android (скопировать, а затем удалить) - PullRequest
0 голосов
/ 15 марта 2019

Я пытаюсь переместить данные из одного пути в базу данных реального времени в другой. Поэтому я должен скопировать данные из одного пути (1) в другой путь (2) и после этого удалить данные из (1).

Я пробовал ниже код:

ConfiguracaoFirebase.getFirebaseReferenceRelatorios().limitToFirst(20)
                .addValueEventListener(new ValueEventListener() {
                    @Override
                    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                        for (final DataSnapshot ids: dataSnapshot.getChildren()){


                                String ano = ids.child("ano").getValue().toString();
                                String mes = ids.child("mes").getValue().toString();
                                String dia = ids.child("dia").getValue().toString();
                                String nomePaciente = ids.child("nomePaciente").getValue().toString();

                                moveFirebaseRecord(ids.getRef(), ConfiguracaoFirebase.getFirebaseReferenceReports().child(nomePaciente).child(ano).child(mes).child(dia).child(ids.getKey()));


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

и этот func moveFirebaseRecord:

public void moveFirebaseRecord(final DatabaseReference fromPath, final DatabaseReference toPath) {
    fromPath.addListenerForSingleValueEvent(new ValueEventListener()
    {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot)
        {
            toPath.setValue(dataSnapshot.getValue(), new DatabaseReference.CompletionListener() {
                @Override
                public void onComplete(@Nullable DatabaseError databaseError, @NonNull DatabaseReference databaseReference) {
                    fromPath.removeValue().addOnSuccessListener(new OnSuccessListener<Void>() {
                        @Override
                        public void onSuccess(Void aVoid) {
                            Constant.print("REMOVED: " + fromPath.getKey());
                        }
                    });

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

Однако когда я запускаю, я вижу, что он правильно перемещает fromPath в toPath, но сразу после того, как УДАЛЯЕТ только что созданный toPath ... Так что он удаляет toPath и fromPath ... У кого-нибудь есть идея, почему это происходит и как я могу вырезать и переместить данные из Firebase? Заранее спасибо.

1 Ответ

1 голос
/ 15 марта 2019

Если toPath удаляется после того, как изначально кажется, что оно было записано, это обычно вызывается правилами безопасности.Поэтому проверьте, действительно ли у пользователя есть разрешение на запись в путь.


В общем, я бы настоятельно рекомендовал объединить запись нового значения и удаление существующего значения в одно многопозиционное хранилище.обновите так:

public void onDataChange(DataSnapshot dataSnapshot)
{
    Map<String, Object> updates = new HashMap<String, Object>();
    updates["/path/to/new/value"] = dataSnapshot.getValue();
    updates["/path/to/old/value"] = null;
    rootRef.updateChildren(updates).addOnSuccessListener(new OnSuccessListener<Void>() {
            @Override
            public void onSuccess(Void aVoid) {
                Constant.print("REMOVED: " + fromPath.getKey());
            }
        });
    });
}

Таким образом, либо обе операции завершатся успешно, либо ни одна из них не будет выполнена (например, если правила безопасности отклоняют одну из других).

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