Android Room条件查询:如何结合IN与未分配状态筛选数据
Android Room 多条件筛选优化:支持未分配条目与成员筛选组合
原有实现
我之前用的Android Room查询语句是这样的:
SELECT * FROM Model WHERE (:applyAssigneeFilters IS 0 OR assigneeMemberId IN(:assigneeFilters))...
通过布尔参数applyAssigneeFilters控制是否筛选assigneeMemberId在assigneeFilters列表里的数据,之前运行没问题。
新需求
现在要加「未分配」条目筛选的选项,还得支持和成员筛选组合使用。UI端的复选选项如下:
- 未分配
- Member1
- Member2
之前applyAssigneeFilters只用来判断assigneeFilters.isEmpty(),现在需要实现三种筛选逻辑:
- 只筛未分配的条目
- 同时筛未分配条目和指定成员的条目
- 只筛指定成员的条目
数据与筛选示例
测试数据
Item(id: 1, memberId: 1, unassigned: false) Item(id: 2, memberId: 2, unassigned: false) Item(id: 3, memberId: null, unassigned: true)
场景1:仅勾选「未分配」
选择状态:
[X] 未分配 [ ] Member1 [ ] Member2
预期结果:
Item(id: 3, memberId: null, unassigned: true)
场景2:勾选「未分配」+「Member2」
选择状态:
[X] 未分配 [ ] Member1 [X] Member2
预期结果:
Item(id: 2, memberId: 2, unassigned: false) Item(id: 3, memberId: null, unassigned: true)
场景3:勾选「Member1」+「Member2」
选择状态:
[ ] 未分配 [X] Member1 [X] Member2
预期结果:
Item(id: 1, memberId: 1, unassigned: false) Item(id: 2, memberId: 2, unassigned: false)
解决方案:修改后的查询语句
新增布尔参数includeUnassigned标记是否勾选「未分配」选项,组合后的查询语句如下:
SELECT * FROM Model WHERE -- 全不选时返回所有数据 (:includeUnassigned = 0 AND :applyAssigneeFilters = 0) OR ( -- 匹配未分配条目 (:includeUnassigned = 1 AND unassigned = 1) OR -- 匹配指定成员条目 (:applyAssigneeFilters = 1 AND assigneeMemberId IN(:assigneeFilters)) )
参数说明
includeUnassigned:传1表示勾选「未分配」,传0表示未勾选applyAssigneeFilters:传1表示至少勾选了一个成员选项(此时assigneeFilters是选中成员的ID列表),传0表示没勾选任何成员选项- 两个参数都为0时,返回全部数据(对应UI全不选的场景)
内容的提问来源于stack exchange,提问作者Bresiu
相关产品推荐
相关产品推荐

