Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/209.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何实时订购数据_Android_Firebase_React Native_Firebase Realtime Database - Fatal编程技术网

Android 如何实时订购数据

Android 如何实时订购数据,android,firebase,react-native,firebase-realtime-database,Android,Firebase,React Native,Firebase Realtime Database,我是react native或firebase的初学者,所以我真的不知道如何解释这一点,但我不知道如何对从数据库接收的数据进行排序 假设我有一个数据库: appname items -some_random_generated_string -name: "someString" -value: "999" -type: 0 -some_random_generated_string -name: "someStr

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

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

您可以通过两种方式来实现

首先,只需在当前阵列上调用
.reverse()
。如果调用push方法来添加新项,通常分配给每个子项的键按时间顺序存储。因此,这样称呼应该足够好:

componentDidMount() {
  itemsRef.on('value', snapshot => {
    let data = snapshot.val();
    let items = Object.values(data);
    items.rerverse();
    this.setState({ items });
  });
}
虽然我不知道是否
让items=Object.values(数据)在每个浏览器上按预期顺序排列数据。顺便说一句,
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
,使用
时间戳作为子级,然后像以前一样再次使用
.reverse()