我想知道是否可以在Android / Kotlin中对Firebase数据库应用多个查询。
我需要获取的是我希望每小时都有销售报告。我得到了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)
}
}
}`
答案 0 :(得分:0)
我得到了1个小时,但是再尝试一个小时,我没有得到结果。
代码中的问题是您正在将字符串传递给startAt()
和endAt()
方法。字符串按字典顺序排序,这意味着以下查询:
val query1 = rootRef.child("Sales").orderByChild("time").startAt("00:00:00").endAt("00:30:00")
由于00:30:00
在00:00:00
之后,但是第二个查询是有效的
val query2 = rootRef.child("Sales").orderByChild("time").startAt("23:30:00").endAt("00:00:00")
将不返回任何结果。要解决此问题,您应该将时间存储为时间戳记,不存储为字符串。为此,请从以下帖子中查看我的答案:
最后,只需将时间戳(长值)传递给startAt()
和endAt()
方法,您的问题将得到解决。