Вложенный запрос комнаты и подзапрос - PullRequest
0 голосов
/ 13 октября 2019

Я использую Room в своем проекте Android и хочу написать сложный запрос. Я ищу об этом, и есть некоторые ответы, которые говорят, что используйте @ 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
}

Вот полная статья.

НоЗатем я должен выяснить это в своем коде, чтобы извлечь мой результат, используя циклы и так далее. Я написал свой запрос в @ Query с вложенным запросом и сопоставил столбцы с полями сущностей, используя " как ", например:

Вот ViewModel класс:

class ServiceCard(
    val id: Int,
    val customerInfo: String,
    val time: String,
    val oilFilter: Boolean,
    val airFilter: Boolean,
    val gasFilter: Boolean,
    val oil: Boolean
)

и @ Doa имеет метод @ Query , подобный следующему:

@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>>

}

Есть ли какое-либо преимущество илинедостаток между этими 2?

1 Ответ

0 голосов
/ 13 октября 2019

Оба имеют преимущества перед другими.

Кодирование в Дао является более сложным для одного, другой сложнее для кодирования в Объекте, но большая сложность в Дао больше, чем разница в сложности. сущностей. Таким образом, более простой Dao вполне может выиграть пользу. интерпретируется так, что SQlite обычно очень эффективен. Тем не менее, эффективность вполне может быть тем, что некоторые готовы оставить ради более простого кодирования и, возможно, ради того, к чему он привык. Дао и Класс как один.

...