2017-08-30 3 views
1

私は古いアプリをリファクタリングしています。部屋へのクエリを変更しようとするのは簡単なクエリでは簡単ですが、今はクエリ結果に応じて文字列を返すメソッドが必要ですそれを達成するために?Room Dao条件

@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

。 – chandil03

+0

シャンデル、私は部屋を使用する方法を知っていると私はこの記事を何度も読んだ。 – Yuval

+0

その場合は、関数本体を作成していないはずで、create関数で戻り値の型を指定してください。それを注意深く読んで、あなたの解決策を得ます。 – chandil03

答えて

0

知って幸せになります、私がやって終わるれたものですそれを機能させる。

まず、ルームはメソッドにボディがあるとは思っていませんが、シグネチャのみが必要です。部屋はあなたのための方法を実装します。私はKotlinの空のbodyメソッドがデフォルトの実装のように振舞うので、使用されないだろうと思います。

また、あなたのような複雑なパラメータの例は見当たりません。すべての例は、引数の中のフィールドではなく、@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タイプで定義されたタイプ。

追加情報についてのあなたが本当にこの最初のhttps://developer.android.com/topic/libraries/architecture/room.htmlを読む必要はRoom Persistence Libraryを参照してください。

+1

こんにちはXavier、 SHIFT_TABLEは別のファイルの変数です(const val SHIFT_TABLE = "Shift")。 一般的に私は部屋の使い方を知っています(私はそれと別のアプリケーションを構築しました)。 別の方法を使用することもできます。 私はもっと「エレガントな」方法を望んでいました。 – Yuval

+0

SHIFT_TABLEについて、私のせいで、私はKotlinとJavaを混在させました。あなたが部屋を知っていることについて、違反行為をしないでください。他の開発者にとって有益なので、私はできるだけ広範囲に答えようとしました。 –

+1

撮影されていません。 – Yuval