【问题标题】:Firebase orderByChild on React NativeReact Native 上的 Firebase orderByChild
【发布时间】:2019-03-08 07:41:04
【问题描述】:

我在 android 上排序列表时遇到问题。数据库 ref items/ 如下所示:

{
    "11" : {
        "date" : "2018-11-18 10:07:00",
        "letter" : "F",
        "number" : 11
    },
    "12" : {
        "date" : "2018-11-01 14:41:00",
        "letter" : "B",
        "number" : 12
    },
    "13" : {
        "date" : "2018-11-13 14:00:00",
        "letter" : "C",
        "number" : 13
    },
    "14" : {
        "date" : "2019-04-22 22:15:30",
        "letter" : "D",
        "number" : 14
    },
    "15" : {
        "date" : "2019-04-22 20:33:00",
        "letter" : "H",
        "number" : 15
    },
    "16" : {
        "date" : "2019-04-22 19:30:00",
        "letter" : "J",
        "number" : 16
    },
    "17" : {
        "date" : "2019-04-25 13:10:00",
        "letter" : "G",
        "number" : 17
    },
    "18" : {
        "date" : "2019-04-25 18:00:00",
        "letter" : "E",
        "number" : 18
    },
    "19" : {
        "date" : "2019-04-25 13:00:00",
        "letter" : "I",
        "number" : 19
    },
    "20" : {
        "date" : "2019-04-28 12:30:00",
        "letter" : "A",
        "number" : 20
    }
}

我正在查询它,期望结果按“字母”键排序:

firebase.database().ref('items/').orderByChild('letter').on('value', snapshot => {
    let items = snapshot.val()
    Object.values(items).map(i => console.log(i.number, i.letter, i.date))
})

但我得到的结果记录如下:

11 F 2018-11-18 10:07:00
12 B 2018-11-01 14:41:00
13 C 2018-11-13 14:00:00
14 D 2019-04-22 22:15:30
15 H 2019-04-22 20:33:00
16 J 2019-04-22 19:30:00
17 G 2019-04-25 13:10:00
18 E 2019-04-25 18:00:00
19 I 2019-04-25 13:00:00
20 A 2019-04-28 12:30:00

显然 orderByChild('letter') 没有得到应用。我可能会错过什么?

【问题讨论】:

  • 考虑将日期存储为 Long(数字为 JS)
  • 谢谢。同时,你能测试并确认我有同样的问题吗?

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


【解决方案1】:

显然,在 JavaScript 中如何处理对象存在问题,这就是为什么有一个可以使用的 snapshot.forEach 方法而不是我正在使用的 Object.values(items).map 的原因。我的听众应该是这样的:

firebase.database().ref('items/').orderByChild('letter').on('value', snapshot => {
    snapshot.forEach(c => { i = c.val(); console.log(i.number, i.letter, i.date) })
})

由于 JavaScript 对象的工作方式,数据在 val() 返回的 JavaScript 对象不能保证与 在服务器上排序,也不是 child_added 事件的排序。那是 forEach() 派上用场的地方。它保证了一个孩子 DataSnapshot 将按其查询顺序进行迭代。

https://firebase.google.com/docs/reference/js/firebase.database.DataSnapshot#forEach

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-22
    • 2020-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-02
    • 2015-06-13
    • 1970-01-01
    相关资源
    最近更新 更多