Условия комнаты Дао

Я реорганизую старое приложение и пытаюсь изменить запросы в комнату, это просто для простых запросов, но теперь мне нужен метод для возврата строки в соответствии с результатом запроса, и я не могу понять, как это сделать?

@Query("SELECT * FROM $SHIFT_TABLE WHERE ($SHIFT_START_DATE BETWEEN :arg0.startDateTime AND :arg0.endDateTime ) OR $SHIFT_END_DATE BETWEEN :arg0.startDateTime AND :arg0.endDateTime )" + " OR (($SHIFT_START_DATE <= :arg0.startDateTime) AND ($SHIFT_END_DATE >= :arg0.endDateTime ))") fun create(shift: Shift) { //there is a shift at that time return shift_overlapping_with_other_shift //shift is shorter that 1 minute return shifts_shorter_than_one_minute_are_not_recorded //else enter the shift and return shift_was_enterd } 

edit: это то, что я делал, если кто-то знает лучший способ, я буду рад узнать

  @Query("SELECT * FROM $SHIFT_TABLE WHERE ($SHIFT_START_DATE BETWEEN :arg0.startDateTime AND :arg0.endDateTime ) OR $SHIFT_END_DATE BETWEEN :arg0.startDateTime AND :arg0.endDateTime )" + " OR (($SHIFT_START_DATE <= :arg0.startDateTime) AND ($SHIFT_END_DATE >= :arg0.endDateTime ))") fun getShiftAtDate(shift: Shift):List<Shift> @Insert fun insertShift(shift: Shift) fun create(shift: Shift):String { //shift is shorter that 1 minute return if (shift.totalTime == 0) {//shift is shorter that 1 minute return MyApp.instance.resources.getString(R.string.shifts_shorter_than_one_minute_are_not_recorded) } //there is a shift at that time if (!getShiftAtDate(shift).isEmpty()){ return MyApp.instance.resources.getString(R.string.shift_overlapping_with_other_shift) } //else enter the shift insertShift(shift) return MyApp.instance.resources.getString(R.string.shift_was_enterd) } 

Есть несколько вещей, которые нужно исправить, чтобы заставить его работать.

Прежде всего, Room не ожидает, что метод будет иметь тело, а просто подпись. Комната будет реализовывать этот метод для вас. Я предполагаю, что пустой метод тела в Kotlin действует как реализация по умолчанию, поэтому он не будет использоваться.

Кроме того, я не видел ни одного примера с такими сложными параметрами, как ваш, все примеры соответствуют аргументу метода с параметром в @Query , а не поле внутри аргумента.

Итак, то, что вы пытаетесь реализовать, должно быть (обратите внимание, что я исправил несбалансированную скобку):

 @Dao interface MyDao { @Query("SELECT * FROM $SHIFT_TABLE WHERE " + "($SHIFT_START_DATE BETWEEN :startDateTime AND :endDateTime) OR " + "($SHIFT_END_DATE BETWEEN :startDateTime AND :endDateTime) OR " + "(($SHIFT_START_DATE <= :startDateTime) AND ($SHIFT_END_DATE >= :endDateTime))") fun create(startDateTime: String, endDateTime: String): List<ShiftModel> } 

Обратите внимание, что, вероятно, типы аргументов, которые я использовал, могут быть неправильными (настройте его на тип, определенный в вашем типе Shift .

Дополнительную информацию см. В Библиотеке сохранения пространства .