如何高效查询带有两个 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”