如何在Android Studio中用Java实现单选按钮触发时获取Firebase一周数据
修正Firebase周支出查询逻辑
核心思路
要获取包含当日在内的7天支出,关键是计算准确的时间范围,再通过Firebase Realtime Database的orderByChild()+startAt()+endAt()组合查询过滤数据。
步骤与代码修正
假设你的数据库中支出节点的date字段存储的是毫秒级时间戳,如果是yyyy-MM-dd格式的字符串日期,只需调整日期格式化逻辑即可。
1. 计算7天时间范围
先获取当前日期的结束时间,再算出7天前的起始时间(包含当日共7天):
// 获取今日23:59:59的时间戳作为查询结束点 Calendar endCal = Calendar.getInstance(); endCal.set(Calendar.HOUR_OF_DAY, 23); endCal.set(Calendar.MINUTE, 59); endCal.set(Calendar.SECOND, 59); long endTimestamp = endCal.getTimeInMillis(); // 获取今日往前推6天的00:00:00时间戳作为查询起始点(加今日正好7天) Calendar startCal = Calendar.getInstance(); startCal.set(Calendar.HOUR_OF_DAY, 0); startCal.set(Calendar.MINUTE, 0); startCal.set(Calendar.SECOND, 0); startCal.add(Calendar.DAY_OF_MONTH, -6); long startTimestamp = startCal.getTimeInMillis();
2. 修正单选按钮监听中的查询逻辑
在weeklyCB的选中监听里,替换原有查询逻辑:
weeklyCB.setOnCheckedChangeListener((buttonView, isChecked) -> { if (isChecked) { // 获取UsersExpense节点的数据库引用 DatabaseReference expenseRef = FirebaseDatabase.getInstance().getReference("UsersExpense"); // 构建周支出查询:按date字段排序,筛选7天内的数据 Query weeklyExpenseQuery = expenseRef .orderByChild("date") .startAt(startTimestamp) .endAt(endTimestamp); // 监听查询结果 weeklyExpenseQuery.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot snapshot) { List<Expense> weeklyExpenses = new ArrayList<>(); for (DataSnapshot expenseSnap : snapshot.getChildren()) { Expense expense = expenseSnap.getValue(Expense.class); if (expense != null) { weeklyExpenses.add(expense); } } // 在这里处理获取到的7天支出数据,比如展示到UI上 } @Override public void onCancelled(@NonNull DatabaseError error) { // 处理查询失败场景,比如打印错误日志 Log.e("FirebaseQuery", "周支出查询失败: " + error.getMessage()); } }); } });
3. 新手必看注意事项
- 确保你的
Expense实体类字段与数据库节点的键完全匹配(比如数据库里的date对应类中的long date或String date) - 如果日期存储为
yyyy-MM-dd格式的字符串,修改时间范围计算逻辑:SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd", Locale.getDefault()); String endDate = sdf.format(new Date()); Calendar startCal = Calendar.getInstance(); startCal.add(Calendar.DAY_OF_MONTH, -6); String startDate = sdf.format(startCal.getTime()); // 查询逻辑改为字符串匹配 Query weeklyExpenseQuery = expenseRef .orderByChild("date") .startAt(startDate) .endAt(endDate); - 给
UsersExpense节点添加索引规则,避免大数据量下查询卡顿:{ "rules": { "UsersExpense": { ".indexOn": "date" } } }
内容的提问来源于stack exchange,提问作者prabin chand
相关产品推荐
相关产品推荐

