Я новичок в 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, но не нашел решения. Также попытался добавить идентификатор, а затем заказать с ним и не пришел к решению.
Я предполагаю, что это доступ к базе данных для получения элементов, поэтому я также попытался упорядочить их в одной строке, но ничего не сработало, кроме ограничения объема данных.
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,
});
};
В основном, чего я хочу добиться, так это отображать данные в обратном порядке, чем они были добавлены, чтобы последний добавленный был показан вверху.
Вы можете сделать это двумя способами.
Сначала просто вызовите .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 orderByChild
при извлечении данных, используя timestamp
в качестве дочернего элемента, а затем .reverse()
снова, как мы делали ранее.