Kotlin开发场景下无法从Firebase获取最近30天帖子数据求助
问题原因
- 构造的
orderByChild("timestamp")查询未绑定事件监听器,查询从未实际执行 - 时间对比逻辑错误:将时间对象转字符串后再转整型的操作无法得到正确的时间戳数值,也没有和Firebase中存储的时间戳单位对齐
- 全量拉取数据后在客户端筛选的逻辑效率极低,数据量较大时会浪费带宽和设备性能
修复方案
直接使用Firebase查询的startAt方法在服务端完成筛选,无需拉取全量数据再本地判断,修正后的代码如下:
// 计算30天前的时间戳,注意和Firebase中存储的timestamp单位对齐 // 若Firebase存的是秒级时间戳,可改为minusSeconds(30L * 24 * 60 * 60).toEpochSecond() val thirtyDaysAgoTimestamp = Instant.now().minusMillis(30L * 24 * 60 * 60 * 1000).toEpochMilli() val database: DatabaseReference = Firebase.database.reference // 构造查询:按timestamp排序,只返回大于等于30天前时间戳的数据 val postQuery = database.orderByChild("timestamp").startAt(thirtyDaysAgoTimestamp) val postListener = object : ValueEventListener { @RequiresApi(Build.VERSION_CODES.O) override fun onDataChange(dataSnapshot: DataSnapshot) { postsList.clear() for (postSnapshot in dataSnapshot.children) { val post = postSnapshot.getValue(PostsModel::class.java) post?.let { postsList.add(it) } } // 此处可添加列表更新后的UI刷新逻辑 } override fun onCancelled(databaseError: DatabaseError) { Timber.d("拉取数据失败: ${databaseError.message}") } } // 给查询绑定监听器,触发查询执行 postQuery.addValueEventListener(postListener)
Firebase数据结构

内容的提问来源于stack exchange,提问作者Ishan Khandelwal
相关产品推荐
相关产品推荐

