如何高效查询带有两个 WHERE 子句的表(Android Room)

Posted

技术标签:

【中文标题】如何高效查询带有两个 WHERE 子句的表(Android Room)【英文标题】:How to query a table with two WHERE clauses efficiently (Android Room) 【发布时间】:2018-04-10 23:54:54 【问题描述】:

假设我有一个对象

class Person 
    String firstName;
    String lastName;
    ... other fields...

和一个包含

的数据库
@Entity
class DatabaseTable 
    String firstName;
    String lastName;
    ... other unrelated fields from person...

现在在我的道中,我有

@Query("SELECT * FROM DatabaseTable WHERE " +
        " firstName = :firstName AND lastName = :lastName")
List<DatabaseTable> getAll(String firstName, String lastName);

我有一个列表,我想从中查询 DatabaseTable。

Person("Apple", "Kohn", ...)
Person("Benny", "Lorie", ...)
Person("Cindy", "May", ...)
... 

我将如何有效地提取数据库表?为我列表中的每个人调用 dao 似乎不正确。

编辑:

我想知道如何使用单个查询来检索结果列表。

我知道 Room 在后台使用 ContentValue 循环实体列表。 有没有办法让我们创建自己的 contentValue 来传递给 Room?

是否可能出现以下情况?

getAllWithPairs( List<String> firstNames, List<String> lastNames);

【问题讨论】:

我认为你应该更清楚你在问什么。是查询不起作用还是您正在寻找优化的代码? @PankajKumar,我想知道是否可以使用单个查询来检索结果列表。 (见编辑) 【参考方案1】:

通过在 WHERE 语句的第一部分之后添加 AND,您可以附加额外的 WHERE 逻辑。

样本

@Query("SELECT * FROM content WHERE timestamp >= :timeframe AND feedType = :feedType ORDER BY qualityScore DESC")
fun getMainContent(timeframe: Date, feedType: FeedType): DataSource.Factory<Int, Content>

【讨论】:

【参考方案2】:

如果我正确理解了您的问题,您正在调用

List<DatabaseTable> getAll(String firstName, String lastName);

为您数据库中的每个人一次一个。我认为您正在寻找的是:

@Query("SELECT * FROM DatabaseTable")
List<DatabaseTable> getAll();

这应该让你每个人都获得表格 - DatabaseTable

对于问题的编辑部分,试试这个:

@Query("SELECT * FROM DatabaseTable WHERE 
    firstName IN (:firstNames) AND secondName IN (:lastNames)")
getAllWithPairs(List<String> firstNames, List<String> lastNames);

【讨论】:

列表的顺序很重要。假设我想要“Peter Parker”和“Clark Kent”。在您的查询语句中 - 将选择“Peter Kent”和“Clark Parker”。 好的,现在我明白了。我会做一个小实验,然后回复你(可能需要一周左右,因为我从明天起要离开一周)。在我的脑海中,我会说让 Person pojo 成为一个实体,然后使用 @ForeignKey 来返回你的结果。然后,如果您不想存储 Person 数据,您始终可以使用您创建的 DAO 在查询返回结果后删除该表中的所有内容。这里有几个链接可能会有所帮助:developer.android.com/reference/android/arch/persistence/room/…***.com/a/45990201/1017607【参考方案3】:

通过在WHERE 语句的第一部分之后添加AND,您可以附加额外的WHERE 逻辑。

@Query("SELECT * FROM DatabaseTable WHERE firstName=:firstName AND lastName=:lastName")
fun getAll(firstName : String, lastName : String) : List<DatabaseTable>  

【讨论】:

以上是关于如何高效查询带有两个 WHERE 子句的表(Android Room)的主要内容,如果未能解决你的问题,请参考以下文章

SQL:如何在带有“NOT IN”条件的“Where”子句中使用“and”和“or”

具有多个带有 AND 类型逻辑连接的 where IN 子句的配置单元查询

2 带有 WHERE 子句的表连接

带有 WHERE 的 DISTINCT 子句

一个带有两个where子句的查询中的两个sql总和[重复]

带有两个日期列的 sql 查询“where 子句”