我是使用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,
});
};
基本上,我要实现的是显示数据的顺序与添加的顺序相反,因此最后添加的数据将显示在顶部。
答案 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()
。