【问题标题】:How to query a table with two WHERE clauses efficiently (Android Room)如何高效查询带有两个 WHERE 子句的表(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,我想知道是否可以使用单个查询来检索结果列表。 (见编辑)

标签: android sql sqlite kotlin android-room


【解决方案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/…stackoverflow.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>  
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多