Как увеличить значения данных базы данных Firebase Realtime на единицу в React Native? - PullRequest
1 голос
/ 14 мая 2019

У меня есть база данных Firebase Realtime, подобная этой.

myRoot |--- mykey1 | |---myValue: 1 | |--- mykey2 | |---myValue: 0 | |--- mykey3 |---myValue: 2

Мне нужно увеличить все эти значения на единицу и получить следующий вывод.

myRoot |--- mykey1 | |---myValue: 2 | |--- mykey2 | |---myValue: 1 | |--- mykey3 |---myValue: 3

Как я могу сделать это с помощью цикла?Или каков наилучший способ сделать это в React Native?

Реальная вещь, которую я хочу, это это.Давайте подумаем, у меня есть домашний экран.Имеет кнопку «Список значений».Когда я щелкаю, я перехожу на следующую страницу (стековый навигатор) и там отображаются значения myKey1, myKey2, myKey3.Это плоский список.Давайте подумаем, что на втором экране есть кнопка с именем «Приращения значений».Когда я нажал его, я хочу увеличить значения и вернуться к начальному экрану.

Я пробовал что-то подобное.

let arr = ['myKey1' , 'myKey2' , 'myKey3']

try {
  for(let i=0; i<arr.length; i++) {
     let ref = firebase.database().ref(myRoot).child(arr[i]);
     ref.transaction( function(myValue) {
        return (myValue || 0) + 1;
     })
  }
  this.props.navigation.goBack();
}
catch(error) {
  console.log(error));
}

Он изменяет значения в базе данных какЯ жду.Но после выполнения выдается следующее желтое предупреждение:

Невозможно вызвать setState (или forceUpdate) для несмонтированного компонента.Это не работает, но это указывает на утечку памяти в вашем приложении.Чтобы исправить, отмените все подписки и асинхронные задачи в методе componentWillUnmount

Это образец модели, объясняющий, что мне нужно.

Как решить эту проблему?

1 Ответ

1 голос
/ 14 мая 2019

Обратите внимание, что вы звоните: .then(() => this.props.navigation.goBack()); в каждой итерации. Я думаю, что вам нужно использовать runTransaction, как описано в транзакциях .

Образцы для структуры как:

myRoot
  |--- mykey1: number

Для такой структуры:

myRoot
  |--- mykey1
  |     |---myValue: number

вместо этого следует использовать следующее const ref объявление:

const ref = db.ref(myRoot).child(key).child('myValue');

Образец Firestore

const arr = ['myKey1' , 'myKey2' , 'myKey3'];
const db = firebase.database();

db.runTransaction(transaction => {
    return Promise.all(arr.map(key => {
      const ref = db.ref(myRoot).child(key);
      return transaction
        .get(ref)
        .then(val => transaction.update(ref, (val || 0) + 1));
    }));
  })
  .then(() => this.props.navigation.goBack())
  .catch((error) => console.log(error))

Пример базы данных в реальном времени

const arr = ['myKey1' , 'myKey2' , 'myKey3'];
const db = firebase.database();

Promise.all(arr.map(key => {
    const ref = db.ref(myRoot).child(key);
    return ref.transaction(function(myValue) {
      return (myValue || 0) + 1;
    })
  }))
  .then(() => this.props.navigation.goBack())
  .catch((error) => console.log(error))

...