android - Android Room 的可选查询参数

标签 android dao android-room optional-parameters

我有以下带有查询的 DAO:

@Dao
public interface BaseballCardDao {
    @Query(
        "SELECT * FROM baseball_cards " +
        "WHERE brand LIKE :brand " +
        "  AND year = :year " +
        "  AND number LIKE :number " +
        "  AND player_name LIKE :playerName " +
        "  AND team LIKE :team"
    )
    LiveData<List<BaseballCard>> getBaseballCards(
        String brand, int year, String number, String playerName, String team
    );
}
String参数是“可选的”,因为我可以通过 "%%"由于 LIKE 匹配所有行运算符(operator)。但我不能用 year 做到这一点因为它是 int .一种解决方案是添加两个不同的 @Query方法,一种是 int year参数和其他没有。有没有更优雅的方法来使用 Room 的 @Query 创建可选参数? ?

最佳答案

这是一个迟到的答案,但正如我最近遇到的那样,我想为那些正在寻找它的人分享我的简单(但愚蠢!)技巧。
正如@CommonsWare 所说,我们可以添加 OR检查 null 的语句,然后简单地使我们的可选参数为 null 并传递 null为他们。
例如,您的查询如下所示:

@Dao
public interface BaseballCardDao {
    @Query(
        "SELECT * FROM baseball_cards " +
        "WHERE (:brand IS NULL OR brand LIKE :brand)" +
        "  AND (:year IS NULL OR year = :year)" +
        "  AND (:number IS NULL OR number LIKE :number)" +
        "  AND (:playerName IS NULL OR player_name LIKE :playerName)" +
        "  AND (:team IS NULL OR team LIKE :team)"
    )
    LiveData<List<BaseballCard>> getBaseballCards(
        @Nullable String brand, @Nullable Integer year, @Nullable String number, @Nullable String playerName, @Nullable String team
    );
}
或者使用 kotlin 和可选参数更具声明性:
@Query(
    """SELECT * FROM baseball_cards 
        WHERE (:brand IS NULL OR brand LIKE :brand) 
        AND (:year IS NULL OR year = :year) 
        AND (:number IS NULL OR number LIKE :number) 
        AND (:playerName IS NULL OR player_name LIKE :playerName)
        AND (:team IS NULL OR team LIKE :team)"""
)
fun getBaseballCards(
    brand: String? = null,
    year: Int? = null,
    number: String? = null,
    playerName: String? = null,
    team: String? = null
): LiveData<List<BaseballCard>>
编辑:
请考虑此解决方案对于不可为空的字段很有用。如果该字段可以为空,并且您想查找该字段没有值的记录,则这不是正确的查询方式,您可以考虑创建动态查询。

关于android - Android Room 的可选查询参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52029435/

相关文章:

java - Singleton DAO 实例在 HTTP 事务之间保留旧的关闭 session

android - isOpen 函数对 Room 数据库或 SQLite 有效吗?

android - 用于 Android 编程的 XML

java - 数据库和文件持久化之间的接口(interface)

ajax - Coldfusion 8 - DAO AJAX 访问的最佳实践?

Android,类型参数列表适配器

android - Room 中的多态实体

Android Gradle 插件问题 : React Native app(just release) crashed when update AGP to 4. 1.2

android - OpenGL ES 2.0 漫射照明 : model shows up black

android - 在 C4droid 中包含新的头文件