Как заказать данные на лету - PullRequest
0 голосов
/ 09 апреля 2019

Я новичок в программе native 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, но не нашел решения.Также попытался добавить идентификатор, а затем заказать его и не пришел к решению.

Я предполагаю, что это доступ к базе данных, чтобы получить элементы, поэтому я также попытался упорядочить их в той же строке, но ничего не работало, кроме ограниченияколичество данных.

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 Ответ

1 голос
/ 09 апреля 2019

Вы можете сделать это двумя способами.

Сначала просто вызовите .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, это добавить объекты как таковые:

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

и использовать firebase'sФункция orderByChild при извлечении данных, используя timestamp в качестве дочернего элемента, а затем .reverse() снова, как мы делали ранее.

...