質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Q&A

1回答

726閲覧

Roomでの条件付け

tetejiro

総合スコア15

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

0グッド

0クリップ

投稿2024/02/25 08:42

実現したいこと

カレンダーを表示しており、日付をタップするとその日付の詳細画面へ遷移します。
その日付画面で、その日付に紐づけられているレコードを表示したいです。

現状は全部のレコードをクエリして表示させています。
ここからその日付だけのレコードをクエリするように修正したいです。

そのために、LocalDateTime のカラム(datetime)を持っているのですが
datetime が該当する日付であることを条件にクエリできるようにしたいです。

※ViewModel や LiveData などは軽く見ているんですがまだ全然わかっていないので
出来る限りRoomでいきたいです。
気持ち的には、LiveData などの方がいいんだろうと思っているのですが、
(理解に時間がかかるタイプなので)かなりの時間がかかると思っていて、
一度このアプリを完成させた後に、リファクタリングの過程で取り入れていきたいと思っています。
このように、タイミングを後回しにするのは、あまり適切ではないでしょうか?
もしよろしければこちらにもアドバイスいただけますと嬉しいです。
(もしも業務として取り組むならという前提でお願いします。)

どうぞご回答よろしくお願いします。

該当のソースコード

TimeTableDao.java

1@Dao 2public interface TimeTableDao { 3 @Query("SELECT id, title, is_done FROM time_tables") // 現状このメソッドを用いて、全件取得しています。 4 List<TimeTableEntity> getAll(); 5}

TimeTableEntity.java

1@Entity(tableName = "time_tables") 2public class TimeTableEntity { 3 @PrimaryKey(autoGenerate = true) 4 public int id; 5 6 @ColumnInfo(name = "title") 7 @NonNull 8 public String title; 9 10 @ColumnInfo(name = "datetime") 11 public LocalDateTime datetime; 12 13 @ColumnInfo(name = "is_done") 14 public Boolean isDone; 15 16 public TimeTableEntity(String title, Boolean isDone) { 17 this.title = title; 18 setDatetime(); 19 this.isDone = isDone; 20 } 21}

DateFragment.java

1// 取得時処理 2List<TimeTableEntity> returnedTimeTableEntities = new ArrayList<>(); 3AppDatabase database = Room.databaseBuilder(getActivity().getApplicationContext(), 4AppDatabase.class, "TimeTable").build(); 5timeTableDao = database.timeTableDao(); 6returnedTimeTableEntities.addAll(timeTableDao.getAll());

Converters.java

1public class Converters { 2 3 @TypeConverter 4 public static LocalDateTime fromDateTime(String value) { 5 return value == null ? null : LocalDateTime.parse(value); 6 } 7 8 @TypeConverter 9 public static String toDateTime(LocalDateTime datetime) { 10 return datetime == null ? null : datetime.toString(); 11 } 12}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

日時を固定長の文字列として保存していれば、文字列レベルの比較で結果的に日時の比較になります。

@Query("SELECT * FROM TimeTable WHERE :start <= datetime AND datetime < :endExclusive ORDER BY datetime") List<TimeTableEntity> getAllWithinRange(LocalDateTime start, LocalDateTime endExclusive);

このような定義なら、日付が選択されて LocalDate date に入っているとするなら

java

1 LocalDateTime start = date.atStartOfDay(); 2 LocalDateTime endExclusive = start.plusDays(1); 3 TimeTableDao timeTableDao = appDatabase.getTimeTableDao(); 4 List<TimeTableEntity> list = timeTableDao.getAllWithinRange(start, endExclusive);

でその日のデータが取れます。


以前の質問 android room に関するエラー の回答に 私の GitHub のご案内をしましたが、そのコードは既に ViewModel と LiveData を用いて MonthFragment で選択した日のデータを DateFragment に表示するようにしてあります。

流れとしては、

  1. MonthFragment: 日付を選択すると MainViewModel にセット
  2. MainViewModel: 日付の更新を感知してデータベースに SELECT の実行を依頼 (DAO)
  3. Room: データベースは別スレッドで SELECT を実行し、結果を予め返していた LiveData に設定
  4. MainViewModel: LiveData の設定更新を受けて結果を読み、 DateFragment が表示するデータを更新
  5. DateFragment: データの更新を受けてアダプタが読み、表示を更新

となります。

これにより、 MonthFragment も DateFragment もお互いを知らず、ただ ViewModel に設定するだけ /ViewModel からデータを貰って表示するだけとなり、例えばレイアウトを切り替え式にしても 2 ペイン同時表示式にしてもそのまま使えます。(画面がある程度広ければ 2 ペインになるようにしてあります。)


一度このアプリを完成させた後に、リファクタリングの過程で取り入れていきたい

使い慣れないものはとりあえず使わないで進めたいというのはとても分かります(^^;
ですが『業務で』という話になると、自分一人で好きに書くだけでは済みません。開発は大抵チームですので、使うにしろ使わないにしろそれなりの理由を持ってチームで決め、それに従う必要があります。
「理解に時間がかかるタイプ」として、もし使うことになったらその"時間"があるでしょうか。

投稿2024/02/25 10:55

編集2024/02/25 18:40
jimbe

総合スコア12775

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tetejiro

2024/03/02 13:57

いつもご回答ありがとうございます。 自分で勉強する際には特に、取り入れるべき技術を都度すぐに取り入れ、 実務で必要になった際には同じように動けるようにしておく 必要があるとお話を受けて感じました。 ありがとうございます。 room に関してのご説明もありがとうございます。 流れを説明いただいたので、理解に大いに役立てることができました。 毎回本当にご丁寧に回答いただき、本当にありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問