房间Dao条件

时间:2017-08-30 09:37:25

标签: android database kotlin

我正在重构一个旧的应用程序并试图将查询更改为空间对于简单查询是直截了当的,但现在我需要一个方法来根据查询结果返回一个字符串,我无法弄清楚如何完成它?

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

编辑:这就是我最终要做的事,如果有人知道更好的方式我会很高兴知道

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

1 个答案:

答案 0 :(得分:0)

为了使其发挥作用,有一些事情需要纠正。

首先,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类型中定义的类型。

有关其他信息,请参阅Room Persistence Library