You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 06:13:18