Изменение пути элемента в Firebase - PullRequest
0 голосов
/ 17 марта 2019

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

firebase.database().ref('completed').on('value', (snapshot) => {
  snapshot.forEach((snapchild) => {
    if(snapchild.val().title === item.title && snapchild.val().id === item.id) {
      firebase.database().ref('todos').push(snapchild.val()).then(() => {
        firebase.database().ref(`anotherlocation/${snapchild.key}`).remove()
      }
    }
  })
})

К сожалению, это не работает, элемент удаляется, но не добавляется в другое место. Это правильный способ сделать это?

Редактировать: добавлена ​​структура Firebase. db

Ответы [ 2 ]

2 голосов
/ 17 марта 2019

Есть несколько проблем с кодом:

  1. Вы звоните push в новом месте, что означает, что предмет добавляется с новым ключом.Вы, вероятно, захотите, чтобы элемент имел тот же ключ в своем новом местоположении, что и в старом.
  2. Вы выполняете две операции с базой данных, что означает, что первая может быть успешной, а другая - неудачной.,Используя одно многопозиционное обновление, вы можете убедиться, что обе записи выполнены успешно, или ни одна из них не выполнена.
  3. Вы читаете больше элементов, чем нужно.Поскольку вы знаете id элементов, которые вы хотите переместить, вы можете ограничить эту операцию чтения

В коде:

var query = firebase.database().ref('completed').orderByChild('id').equalTo(item.id);
query.on('value', (snapshot) => {
  snapshot.forEach((snapchild) => {
    if(snapchild.val().title === item.title) {
      var updates = {};
      updates['/todos/'+snapchild.key] = snapchild.val();
      updates['/completed/'+snapchild.key] = null;
      firebase.database().ref().update(updates);
    }
  })
})

Это перемещаетсязавершенный предмет с item.id обратно на todos.Я не уверен, что это именно то, что вы хотите сделать, так как это не было ясно из вашего вопроса.Если нет, вам придется обновить пути в updates.

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

Я однажды написал метод, который сначала создает копию, а затем удаляет исходный узел.это только нужно было бы перенести с Java на JavaScript, что должно быть довольно простой задачей.порядок операций, как минимум, работает.как правило, вы должны заменить .on('value') на .once('value'), потому что дальнейших событий не будет - и удаление должно быть зафиксировано ChildEventListener на родительском узле (или, тем не менее, это называется в JavaScript).если вы хотите написать подлинный сценарий, инкапсуляция в транзакции будет иметь смысл для данного сценария.

/** relocates a record from one to another path (v2). */
protected void move(final DatabaseReference source, final DatabaseReference target) {
    source.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot snapshot) {
            target.setValue(snapshot.getValue(), new DatabaseReference.CompletionListener() {

                @Override
                public void onComplete(DatabaseError databaseError, @NonNull DatabaseReference databaseReference) {

                    /* if not the operation has failed */
                    if (databaseError != null) {
                        if(mDebug) {Log.w(LOG_TAG, databaseError.getMessage());}
                    } else {

                        /* remove the source path */
                        source.removeValue(new DatabaseReference.CompletionListener(){
                            @Override
                            public void onComplete(DatabaseError databaseError, @NonNull DatabaseReference databaseReference) {
                                if(mDebug) {Log.d(LOG_TAG, "moved " + source.toString() + " to " + target.toString());}
                            }
                        });
                    }
                }
            });
        }
        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {
            if(mDebug) {Log.w(LOG_TAG, databaseError.getMessage());}
        }
    });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...