首页 > 解决方案 > 如何即时订购数据

问题描述

我是 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,
  });
};

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

标签: androidfirebasereact-nativefirebase-realtime-database

解决方案


你可以通过两种方式做到这一点。

首先简单地调用.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()
  });
};

orderByChild并在您获取数据时使用firebase的功能,timestamp作为孩子使用,然后.reverse()像我们之前一样再次使用它。


推荐阅读