如何即时订购数据

时间:2019-04-09 19:30:52

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

我是使用react native或firebase的初学者,所以我真的不知道如何解释这一点,但是我不知道如何从数据库中订购接收到的数据。

假设我有一个数据库:

appname
   items
     -some_random_generated_string
       -name: "someString"
       -value: "999"
       -type: 0
     -some_random_generated_string
       -name: "someString"
       -value: "999"
       -type: 0

我已经尝试了所有订单类型,还设置了.indexOn规则,但尚未解决。还尝试添加一个ID,然后对其进行排序,但未解决。

我想这是在访问数据库以获取项目,所以我也尝试在同一行上对它们进行排序,但是除了限制数据量之外没有任何作用。

let itemsRef = db.ref('items');

那我有:

componentDidMount() {
    itemsRef.on('value', snapshot => {
      let data = snapshot.val();
      let items = Object.values(data);
      this.setState({ items });
    });
  }

我要这样添加:

let addItem= (item, value, type) => {
  db.ref('/items').push({
    name: item,
    value: value,
    type: type,
  });
};

基本上,我要实现的是显示数据的顺序与添加的顺序相反,因此最后添加的数据将显示在顶部。

1 个答案:

答案 0 :(得分:1)

您可以通过两种方式进行操作。

首先只需在当前数组上调用.reverse()。如果您调用push方法添加新项目,通常分配给每个子仓库的密钥将按时间顺序存储。因此,这样称呼就足够了:

componentDidMount() {
  itemsRef.on('value', snapshot => {
    let data = snapshot.val();
    let items = Object.values(data);
    items.rerverse();
    this.setState({ items });
  });
}

尽管我不知道let items = Object.values(data);是否在每个浏览器上都按预期顺序对您的数据进行了担保。顺带一提,Object.values()Object.keys()的对立面在许多旧的浏览器中均不受支持,但是如果您在ReactNative中使用它,那就很好了。

如果您要完全确定它的订购顺序正确,请重写为:

componentDidMount() {
  itemsRef.on('value', snapshot => {
    let items = [];
    // forEach always send you the children in the right order
    snapshot.forEach(snap => { 
      items.push(snap.val())
    })
    items.rerverse();
    this.setState({ items });
  });
}

最后,如果您不信任firebase的自动生成的ID,则可以使用以下方法添加对象:

let addItem = (item, value, type) => {
  db.ref('/items').push({
    name: item,
    value: value,
    type: type,
    timestamp: new Date().getTime()
  });
};

,并在获取数据时使用firebase的函数orderByChild,以timestamp作为子元素,然后像以前一样再次.reverse()