在Android中为Firebase数据库应用多个查询的最简单方法

问题描述 投票:0回答:1

我想知道是否可以在Android / Kotlin中对Firebase数据库应用多个查询。

我有一个其中具有time值的firebase数据库。enter image description here

我需要获得的是我希望每小时都有销售报告。我得到了1个小时,但是再尝试一个小时,却没有得到结果。我相信我在逻辑上做错了。

val rootRef = FirebaseDatabase.getInstance().reference
    val query1 = rootRef.child("Sales").orderByChild("time").startAt("00:00:00").endAt("00:30:00")
    val query2 = rootRef.child("Sales").orderByChild("time").startAt("23:30:00").endAt("00:00:00")

    val valueEventListener = object : ValueEventListener {
        override fun onDataChange(p0: DataSnapshot) {
            if (p0.exists()) {
                for(ds in p0.children) {
                    var timeList = arrayListOf<String>()
                    val time = ds.child("time").getValue(String::class.java)!!

                    var totalList = arrayListOf<Double>()

                    timeList.add(time)
                    println("time List : "+timeList)


                }
            }
        }

        override fun onCancelled(databaseError: DatabaseError) {
            Log.d(TAG, databaseError.getMessage()) //Don't ignore errors!
        }
    }
    query2.addListenerForSingleValueEvent(valueEventListener)
    query1.addListenerForSingleValueEvent(valueEventListener)

有人可以帮我理解这里的逻辑吗?谢谢。

......

编辑部分:

这是我所做的:现在,我按照您的建议以毫秒格式保存日期。而且,我的代码如下所示:

   `val query1 = rootRef.child("Sales").orderByChild("time").startAt(1577192700000).endAt(1577192701167)
    val valueEventListener = object : ValueEventListener {
        override fun onDataChange(p0: DataSnapshot) {
            if (p0.exists()) {
                for(ds in p0.children) {

                    var timeList = arrayListOf<Long>()
                    val time = ds.child("time").getValue(Long::class.java)!!


                   // var totalList = arrayListOf<Double>()

                    timeList.add(time)
                    println("time List : "+timeList)


                }
            }
        }`

当我使用毫秒(长值)作为startAt()参数时,会给我错误。enter image description here

android firebase kotlin firebase-realtime-database
1个回答
0
投票

我得到了1个小时,但是再尝试一个小时,却没有得到结果。

代码中的问题是,您正在将字符串传递给startAt()endAt()方法。字符串按字典顺序排序,这意味着以下查询:

val query1 = rootRef.child("Sales").orderByChild("time").startAt("00:00:00").endAt("00:30:00")

由于00:30:0000:00:00之后,但第二个查询将起作用:

val query2 = rootRef.child("Sales").orderByChild("time").startAt("23:30:00").endAt("00:00:00")

将不会返回任何结果。要解决此问题,您应该将时间存储为时间戳,将not存储为字符串。为此,请从以下帖子中查看我的答案:

最后,只需将时间戳(长值)传递给startAt()endAt()方法,您的问题将得到解决。

© www.soinside.com 2019 - 2024. All rights reserved.