【问题标题】:How to increment Firebase Realtime database data values by one in React Native?如何在 React Native 中将 Firebase 实时数据库数据值加一?
【发布时间】:2019-05-14 16:10:37
【问题描述】:

我有一个这样的 Firebase 实时数据库。

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方法中取消所有订阅和异步任务

这是一个示例模型来解释我需要什么。

如何解决这个问题?

【问题讨论】:

    标签: javascript firebase react-native firebase-realtime-database


    【解决方案1】:

    请注意,您在每次迭代中调用:.then(() =&gt; this.props.navigation.goBack());。我认为您需要使用runTransaction 中记录的transactions

    示例用于以下结构:

    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))
    
    

    【讨论】:

    • 感谢您的回复。不幸的是,这没有奏效。没有更新值。请问还有什么解决办法吗?
    • 我已经更新了我尝试过的代码。尽管如此,它仍然可以正常工作并改变我所期望的值。但是,给出同样的黄色警告。
    • 很抱歉,我已经在脑海中回答了 Firestore。我刚刚使用您的代码编辑了一个版本,该代码等待所有承诺完成。
    • 我也试过这段代码。但是,它没有用。执行后,数据库就这样改了。 myKey1: "[object Object]1" myKey2: "[object Object]1" myKey3: "[object Object]1"
    • 那是因为你的更新代码是针对结构myRoot -&gt; myKeyN -&gt; number的。如果您的数据库结构是myRoot -&gt; myKeyN -&gt; myValue -&gt; number,它将显示您的结果。要使用第二种结构达到您想要的结果,您应该将.child('myValue') 附加到const ref = db.ref(myRoot).child(key);
    猜你喜欢
    • 1970-01-01
    • 2021-07-20
    • 1970-01-01
    • 2020-06-04
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多