Room条件语句为空时,查询全部数据

前言 :领带安排,将我们一款量表app做一款离线版本。因为说医院可能有些地方没有外网,且不想提供量表测试数据。所以我就用room数据库,自己做了本地数据库。

问题:当我遇到多条件筛选时,因为Room的查询语句是提前写在Dao里的。如何写呢?上干货

如果name有数据,就按name去查,如果name为空数据,就查全部


@Query("SELECT * FROM PeopleBean WHERE :name='' or name= :name")
Single<List<PeopleBean>> getAllTest(String name);

如果是多参数的情况呢,别急往下看。

这里再增加一个sex字段。-1就查全部。

@Query("SELECT * FROM PeopleBean WHERE (:name='' or name=:name) and (:sex =-1 or sex=:sex)")
Single<List<PeopleBean>> getAll(String name, int sex);

希望对朋友们有帮助。

### 非 `WHERE` 条件的链式调用实现 在数据库查询中,确保 `WHERE` 条件中的字段不为是一个常见的需求。通过链式操作来构建这样的查询语句,可以通过编程语言的功能动态生成 SQL 语句并附加必要的过滤条件。 以下是基于 Kotlin 和 Android 中 ViewModel 的示例代码片段,展示如何在链式调用中实现非 `WHERE` 查询条件: ```kotlin // 假设我们有一个数据访问对象 DAO 接口定义如下: interface MyDao { @Query("SELECT * FROM my_table WHERE column_name IS NOT NULL AND column_name = :value") fun findByValue(value: String): List<MyEntity> } // 使用 ViewModel 提供工厂模式实例化逻辑处理 class MyViewModelFactory(private val dao: MyDao) : ViewModelProvider.Factory { override fun <T : ViewModel?> create(modelClass: Class<T>): T { return MyViewModel(dao) as T } } class MyViewModel(private val dao: MyDao) : ViewModel() { fun fetchDataWithNonNullCondition(value: String): LiveData<List<MyEntity>> { return MutableLiveData(dao.findByValue(value)) } } ``` #### 解析与说明 1. **DAO 层设计** 在 Room 数据库框架下,SQL 查询可以直接写入注解中。为了满足非约束的需求,在查询语句中加入 `IS NOT NULL` 判断[^1]。这一步确保了只有那些指定列值不为数据会被返回。 2. **ViewModel 工厂模式** 使用自定义的 `ViewModelFactory` 可以方便地向 `ViewModel` 注入依赖项(如 DAO 对象)。这种方式有助于分离关注点,并使测试更加容易[^3]。 3. **LiveData 结合异步更新** 返回 `LiveData` 类型以便支持观察者模式,当底层数据发生变化自动通知 UI 更新。此方法特别适合 MVVM 架构下的应用开发场景。 4. **链式调用的实际运用** 如果需要进一步扩展功能或者组合多个筛选条件,则可通过封装更复杂的业务逻辑到 Repository 层完成。例如利用 RxJava/Kotlin Flow 实现流式 API 调用链条。 --- ### 示例 Python 版本 (适用于 SQLAlchemy ORM) 对于其他技术栈比如 Python 下面给出另一种解决方案——借助 SQLAlchemy ORM 完成相同目标: ```python from sqlalchemy import Column, Integer, String, and_, not_ from sqlalchemy.orm import declarative_base, Session Base = declarative_base() class MyTable(Base): __tablename__ = 'my_table' id = Column(Integer, primary_key=True) name = Column(String) value = Column(String) def fetch_non_null_records(session: Session, filter_value: str): query = session.query(MyTable).filter( and_( MyTable.value.isnot(None), # 确保 value 字段非 MyTable.name == filter_value # 添加额外匹配条件 ) ).all() return query ``` 此处的关键在于 `.isnot(None)` 方法的应用,它对应于标准 SQL 表达式的 `IS NOT NULL` 操作符。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值