Android 房间嵌套查询和子查询

Android 房间嵌套查询和子查询,android,android-room,android-architecture-components,Android,Android Room,Android Architecture Components,我在Android项目中使用Room,并希望编写一个复杂的查询。我搜索了一下,找到了一些答案,巫婆说使用@Embedded如下: class TripAndListsAndListItems { @Embedded var trip: Trip? = null @Relation(parentColumn = "creatorId", entityColumn = "remoteId", entity = User::class) var u

我在Android项目中使用Room,并希望编写一个复杂的查询。我搜索了一下,找到了一些答案,巫婆说使用@Embedded如下:

class TripAndListsAndListItems {
      @Embedded
      var trip: Trip? = null

     @Relation(parentColumn = "creatorId", entityColumn = "remoteId",     entity = User::class)
     var user: List<User>? = null

     @Relation(parentColumn = "remoteId", entityColumn = "tripId", entity = PlanitiList::class)
     var lists: List<ListAndListItems>? = null
}
@Dao
interface ServiceCardDao :ICommonDao<ServiceCard>{

   @Query("SELECT s.services_id as id,  " +
        "s.user_mobile_no as customerInfo, " +
        "( " +
        "SELECT count(*) " +
        "FROM service_detail as sd " +
        "WHERE sd.services_id = s.services_id and sd.service_type_id = 1 " +
        ")              as oilFilter, " +
        "( " +
        "SELECT count(*) " +
        "FROM service_detail as sd " +
        "WHERE sd.services_id = s.services_id and sd.service_type_id = 2 " +
        ")         as airFilter, " +
        "( " +
        "SELECT count(*) " +
        "FROM service_detail as sd " +
        "WHERE sd.services_id = s.services_id and sd.service_type_id = 3 " +
        ")         as gasFilter,  " +
        "( " +
        "SELECT count(*) " +
        "FROM service_detail as sd " +
        "WHERE sd.services_id = s.services_id and sd.service_type_id = 4 " +
        ")         as oil, " +
        "s.service_date as time " +
        "FROM services as s ")
   fun selectAllServicesWithDetail(): LiveData<List<model.ServiceCard>>

}
@Doa有一个@Query方法,如下所示:

class TripAndListsAndListItems {
      @Embedded
      var trip: Trip? = null

     @Relation(parentColumn = "creatorId", entityColumn = "remoteId",     entity = User::class)
     var user: List<User>? = null

     @Relation(parentColumn = "remoteId", entityColumn = "tripId", entity = PlanitiList::class)
     var lists: List<ListAndListItems>? = null
}
@Dao
interface ServiceCardDao :ICommonDao<ServiceCard>{

   @Query("SELECT s.services_id as id,  " +
        "s.user_mobile_no as customerInfo, " +
        "( " +
        "SELECT count(*) " +
        "FROM service_detail as sd " +
        "WHERE sd.services_id = s.services_id and sd.service_type_id = 1 " +
        ")              as oilFilter, " +
        "( " +
        "SELECT count(*) " +
        "FROM service_detail as sd " +
        "WHERE sd.services_id = s.services_id and sd.service_type_id = 2 " +
        ")         as airFilter, " +
        "( " +
        "SELECT count(*) " +
        "FROM service_detail as sd " +
        "WHERE sd.services_id = s.services_id and sd.service_type_id = 3 " +
        ")         as gasFilter,  " +
        "( " +
        "SELECT count(*) " +
        "FROM service_detail as sd " +
        "WHERE sd.services_id = s.services_id and sd.service_type_id = 4 " +
        ")         as oil, " +
        "s.service_date as time " +
        "FROM services as s ")
   fun selectAllServicesWithDetail(): LiveData<List<model.ServiceCard>>

}
@Dao
接口服务carddao:ICommonDao{
@查询(“选择s.services\u id作为id,”+
“作为customerInfo的美国用户\u mobile\u no,”+
"( " +
“选择计数(*)”+
“从服务_详细信息作为sd”+
“其中sd.services\u id=s.services\u id和sd.services\u type\u id=1”+
)作为机油滤清器+
"( " +
“选择计数(*)”+
“从服务_详细信息作为sd”+
“其中sd.services\u id=s.services\u id和sd.services\u type\u id=2”+
)作为空气过滤器+
"( " +
“选择计数(*)”+
“从服务_详细信息作为sd”+
“其中sd.services\u id=s.services\u id和sd.services\u type\u id=3”+
)作为气体过滤器+
"( " +
“选择计数(*)”+
“从服务_详细信息作为sd”+
“其中sd.services\u id=s.services\u id和sd.services\u type\u id=4”+
)作为石油+
“s.service_日期作为时间”+
“从作为服务的服务中”)
乐趣selectAllServicesWithDetail():LiveData
}

这两者之间有什么优势或劣势吗?

两者都比另一个有优势

一个Dao中的编码更复杂,另一个实体中的编码更复杂,但Dao中更大的复杂性大于实体的复杂性差异。因此,简单的刀可能会赢得一些人的青睐

其中一种更为有效,因为不存在获取计数的后期数据检索循环,而且SQLite是编译的C代码,而不是必须解释的JVM字节码,因此SQLite通常非常有效。然而,效率很可能是一些人为了更简单的编码和习惯而愿意放弃的东西


有些人可能会考虑一些替代方法,例如将Dao和类结合为一个。

我认为在这种情况下,使用DavaSaveVIEW是无用的,因为我必须为SQLite查询中的每一个小改动创建新的类,即使在WHERE子句中也是如此。但在DAO中,我可以使用绑定参数,这使得@Query更灵活,便于简单编码。对于任何与OP有相同一般问题的人,这个答案可能会有所帮助: