【问题标题】:How to order data on the fly如何即时订购数据
【发布时间】:2019-04-10 11:23:31
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案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()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-11-07
      • 2020-01-28
      • 2021-07-11
      • 1970-01-01
      • 2021-11-27
      • 1970-01-01
      相关资源
      最近更新 更多