Android:使用Room DAO筛选RecyclerView中的CardView列表
问题排查与解决
你的枚举不会阻止Long值传递到DAO,筛选失效的问题出在以下几个细节上:
1. SQL语句拼接的空格错误
DAO中的查询语句拼接时,AND后未添加空格,导致拼接后的SQL语法失效:
SELECT * FROM cards_table WHERE CardDuedatentime !=-1 ANDCardDuedatentime < :dueDate5 ORDER BY CardDuedatentime ASC
ANDCardDuedatentime是无效的语法片段,Room无法正确解析筛选条件,最终返回全量数据。
修复方式:在AND后补充空格,并把筛选符改成需求的<=(你要的是小于等于所选日期):
@Dao public interface CardDao { @Query("SELECT * FROM cards_table WHERE CardDuedatentime !=-1 AND " + "CardDuedatentime <= :dueDate5 ORDER BY CardDuedatentime ASC") LiveData<List<Card>> getFiltOnOrBeforeList(Long dueDate5); }
2. TimePicker时间获取逻辑错误
你当前代码里cal.getTimeInMillis()获取的是系统当前时间,并非TimePicker选中的时间。需要把TimePicker的选中值同步到Calendar对象:
// 示例:绑定TimePicker的选中时间 Calendar cal = Calendar.getInstance(); // 获取TimePicker的小时和分钟 cal.set(Calendar.HOUR_OF_DAY, timePicker.getHour()); cal.set(Calendar.MINUTE, timePicker.getMinute()); // 如果是日期+时间选择,还要同步年月日(比如从DatePicker获取) // cal.set(Calendar.YEAR, datePicker.getYear()); // cal.set(Calendar.MONTH, datePicker.getMonth()); // cal.set(Calendar.DAY_OF_MONTH, datePicker.getDayOfMonth()); long duedate5 = cal.getTimeInMillis(); Long duedate5Long = duedate5; mViewModel.setSortOrder(Repository.SortOrder.DB_FILTONORBEF, duedate5Long);
3. 验证参数传递是否正常
可以在Repository的分支逻辑里加日志,确认参数是否正确传递:
public LiveData<List<Card>> getSortedItems(SortOrder order, Long duedate5) { switch (order) { case DB_SORTORDER: return cardDao.getAllCards(); case DB_FILTONORBEF: // 打印参数,确认是否正确接收 Log.d("RepoDebug", "筛选日期戳:" + duedate5); return cardDao.getFiltOnOrBeforeList(duedate5); } }
同时可以开启Room的查询日志,查看实际执行的SQL语句和绑定的参数值,进一步排查问题。
内容的提问来源于stack exchange,提问作者AJW
相关产品推荐
相关产品推荐

