回答編集履歴

5

追加

2024/02/25 18:40

投稿

jimbe
jimbe

スコア13045

test CHANGED
@@ -17,10 +17,17 @@
17
17
 
18
18
  流れとしては、
19
19
  1. MonthFragment: 日付を選択すると MainViewModel にセット
20
- 2. MainViewModel: 日付の更新を感知してデータベースに SELECT を発行
20
+ 2. MainViewModel: 日付の更新を感知してデータベースに SELECT の実行依頼 (DAO)
21
21
  3. Room: データベースは別スレッドで SELECT を実行し、結果を予め返していた LiveData に設定
22
22
  4. MainViewModel: LiveData の設定更新を受けて結果を読み、 DateFragment が表示するデータを更新
23
23
  5. DateFragment: データの更新を受けてアダプタが読み、表示を更新
24
24
  となります。
25
25
 
26
26
  これにより、 MonthFragment も DateFragment もお互いを知らず、ただ ViewModel に設定するだけ /ViewModel からデータを貰って表示するだけとなり、例えばレイアウトを切り替え式にしても 2 ペイン同時表示式にしてもそのまま使えます。(画面がある程度広ければ 2 ペインになるようにしてあります。)
27
+
28
+ ---
29
+ >一度このアプリを完成させた後に、リファクタリングの過程で取り入れていきたい
30
+
31
+ 使い慣れないものはとりあえず使わないで進めたいというのはとても分かります(^^;
32
+ ですが『業務で』という話になると、自分一人で好きに書くだけでは済みません。開発は大抵チームですので、使うにしろ使わないにしろそれなりの理由を持ってチームで決め、それに従う必要があります。
33
+ 「理解に時間がかかるタイプ」として、もし使うことになったらその"時間"があるでしょうか。

4

微編集

2024/02/25 17:31

投稿

jimbe
jimbe

スコア13045

test CHANGED
@@ -13,20 +13,14 @@
13
13
  でその日のデータが取れます。
14
14
 
15
15
  ---
16
- 以前の質問 [android room に関するエラー](https://teratail.com/questions/uvkoxkqhp3qe8u) の回答に [私の GitHub](https://github.com/Jimbe-github/tetemalu_RecordTime/tree/q_uvkoxkqhp3qe8u) のご案内をしましたが、そのコードは既に ViewModel と LiveData を用いて MonthFragment で選択した日のデータを DateFragment に表示するようにしてあります。(コンバータは確実に SQLite の日時関数で処理できる形にしています。)
17
- ```java
18
- @Dao
19
- public interface TimeTableDao {
20
- @Insert
21
- long[] insertAll(TimeTableEntity... timeTableEntitys);
16
+ 以前の質問 [android room に関するエラー](https://teratail.com/questions/uvkoxkqhp3qe8u) の回答に [私の GitHub](https://github.com/Jimbe-github/tetemalu_RecordTime/tree/q_uvkoxkqhp3qe8u) のご案内をしましたが、そのコードは既に ViewModel と LiveData を用いて MonthFragment で選択した日のデータを DateFragment に表示するようにしてあります。
22
17
 
18
+ 流れとしては、
23
- @Query("SELECT * FROM TimeTable")
19
+ 1. MonthFragment: 日付を選択すると MainViewModel にセット
20
+ 2. MainViewModel: 日付の更新を感知してデータベースに SELECT を発行
21
+ 3. Room: データベースは別スレッドで SELECT を実行し、結果を予め返していた LiveData に設定
24
- LiveData<List<TimeTableEntity>> getAll();
22
+ 4. MainViewModel: LiveData の設定更新を受けて結果を読み、 DateFragment が表示するデータを更新
23
+ 5. DateFragment: データの更新を受けてアダプタが読み、表示を更新
24
+ となります。
25
25
 
26
- @Query("SELECT * FROM TimeTable WHERE :start <= datetime AND datetime < :endExclusive ORDER BY datetime")
27
- LiveData<List<TimeTableEntity>> getAllWithinRange(LocalDateTime start, LocalDateTime endExclusive);
28
- }
29
- ```
30
- GitHub のほうでは MainViewModel で MonthFragment の選択と DateFragment が表示するデータのリストを管理していて、 MonthFragment で日付を選択して MainViewModel の setSelectedDate メソッドを呼ぶと、 LiveData である selectedDate の更新を関知して DateFragment が表示するデータのリストの LiveData が上のコードで ROOM に別スレッドでの検索を実行してもらい、その結果が出次第が DateFrament のリストを更新するようにしています。
31
-
32
- これにより、 MonthFragment も DateFragment もお互いを知らず、ただ ViewModel に設定するだけ /ViewModel からデータを貰って表示するだけとなり、例えばレイアウトを切り替え式にしても 2 ペイン同時表示式にしてもそのまま使えます。
26
+ これにより、 MonthFragment DateFragment もお互いを知らず、ただ ViewModel に設定するだけ /ViewModel からデータを貰って表示するだけとなり、例えばレイアウトを切り替え式にしても 2 ペイン同時表示式にしてもそのまま使えます。(画面がある程度広ければ 2 ペインになるようにしてあります。)

3

全体編集

2024/02/25 17:07

投稿

jimbe
jimbe

スコア13045

test CHANGED
@@ -1,21 +1,19 @@
1
- 以前質問 [android room に関するエラー](https://teratail.com/questions/uvkoxkqhp3qe8u) の回答に [私の GitHub](https://github.com/Jimbe-github/tetemalu_RecordTime/tree/q_uvkoxkqhp3qe8u) のご案内をたがコードは既 ViewModel と LiveData を用いて MonthFragment で選択した日のデータを DateFragment 表示するようにしてあります。
2
- コンバータの形式を一応 SQLite 形式にし、日毎のデータを所得する SELECT は DAO ( の getAllWithinRange メソッド) に書いています。
3
- 日付が選択されるとその日の開始日時と翌日の開始日時を求めて getAllWithinRange メソッドを呼んでいます。
1
+ 日時を固定長文字列とて保存ていれば文字列レベル比較で結果的に日比較ります。
2
+ ```
3
+ @Query("SELECT * FROM TimeTable WHERE :start <= datetime AND datetime < :endExclusive ORDER BY datetime")
4
+ List<TimeTableEntity> getAllWithinRange(LocalDateTime start, LocalDateTime endExclusive);
5
+ ```
6
+ このような定義なら、日付が選択されて LocalDate date に入っているとするなら
4
7
  ```java
5
- public class Converters {
8
+ LocalDateTime start = date.atStartOfDay();
9
+ LocalDateTime endExclusive = start.plusDays(1);
10
+ TimeTableDao timeTableDao = appDatabase.getTimeTableDao();
6
- private static final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); //SQLite datetime 風?
11
+ List<TimeTableEntity> list = timeTableDao.getAllWithinRange(start, endExclusive);
12
+ ```
13
+ でその日のデータが取れます。
7
14
 
8
- @TypeConverter
9
- public static LocalDateTime toLocalDateTime(String val) {
10
- return LocalDateTime.parse(val, formatter);
11
- }
12
-
13
- @TypeConverter
14
- public static String fromLocalDateTime(LocalDateTime val) {
15
- return formatter.format(val);
16
- }
17
- }
18
- ```
15
+ ---
16
+ 以前の質問 [android room に関するエラー](https://teratail.com/questions/uvkoxkqhp3qe8u) の回答に [私の GitHub](https://github.com/Jimbe-github/tetemalu_RecordTime/tree/q_uvkoxkqhp3qe8u) のご案内をしましたが、そのコードは既に ViewModel と LiveData を用いて MonthFragment で選択した日のデータを DateFragment に表示するようにしてあります。(コンバータは確実に SQLite の日時関数で処理できる形にしています。)
19
17
  ```java
20
18
  @Dao
21
19
  public interface TimeTableDao {
@@ -29,12 +27,6 @@
29
27
  LiveData<List<TimeTableEntity>> getAllWithinRange(LocalDateTime start, LocalDateTime endExclusive);
30
28
  }
31
29
  ```
32
- 日付選択されLocalDate date に入っている場合の取得
33
- ```java
34
- LocalDateTime start = date.atStartOfDay();
35
- LocalDateTime endExclusive = start.plusDays(1);
36
- TimeTableDao timeTableDao = appDatabase.getTimeTableDao();
37
- return timeTableDao.getAllWithinRange(start, endExclusive);
38
- ```
39
- GitHub のほうでは MainViewModel で MonthFragment の選択と DateFragment が表示するデータのリストを管理していて、 MonthFragment で日付を選択して MainViewModel の setSelectedDate メソッドを呼ぶと上のコードで DateFrament のリストを更新するようにしています。
30
+ GitHub のほうでは MainViewModel で MonthFragment の選択と DateFragment が表示するデータのリストを管理していて、 MonthFragment で日付選択MainViewModel の setSelectedDate メソッドを呼ぶと、 LiveData である selectedDate の更新を関知して DateFragment が表示するデータのリストの LiveData が上のコードで ROOM 別スレッドでの検索を実行しもら、その結果が出次第が DateFrament のリストを更新すようにしています。
31
+
40
32
  これにより、 MonthFragment も DateFragment もお互いを知らず、ただ ViewModel に設定するだけ /ViewModel からデータを貰って表示するだけとなり、例えばレイアウトを切り替え式にしても 2 ペイン同時表示式にしてもそのまま使えます。

2

追加

2024/02/25 11:19

投稿

jimbe
jimbe

スコア13045

test CHANGED
@@ -1,4 +1,4 @@
1
- 以前の質問 [android room に関するエラー](https://teratail.com/questions/uvkoxkqhp3qe8u) の回答に 私の GitHub のご案内をしましたが、そのコードは既に ViewModel と LiveData を用いて MonthFragment で選択した日のデータを DateFragment に表示するようにしてあります。
1
+ 以前の質問 [android room に関するエラー](https://teratail.com/questions/uvkoxkqhp3qe8u) の回答に [私の GitHub](https://github.com/Jimbe-github/tetemalu_RecordTime/tree/q_uvkoxkqhp3qe8u) のご案内をしましたが、そのコードは既に ViewModel と LiveData を用いて MonthFragment で選択した日のデータを DateFragment に表示するようにしてあります。
2
2
  コンバータの形式を一応 SQLite 形式にし、日毎のデータを所得する SELECT は DAO ( の getAllWithinRange メソッド) に書いています。
3
3
  日付が選択されるとその日の開始日時と翌日の開始日時を求めて getAllWithinRange メソッドを呼んでいます。
4
4
  ```java
@@ -36,3 +36,5 @@
36
36
  TimeTableDao timeTableDao = appDatabase.getTimeTableDao();
37
37
  return timeTableDao.getAllWithinRange(start, endExclusive);
38
38
  ```
39
+ GitHub のほうでは MainViewModel で MonthFragment の選択と DateFragment が表示するデータのリストを管理していて、 MonthFragment で日付を選択して MainViewModel の setSelectedDate メソッドを呼ぶと上のコードで DateFrament のリストを更新するようにしています。
40
+ これにより、 MonthFragment も DateFragment もお互いを知らず、ただ ViewModel に設定するだけ /ViewModel からデータを貰って表示するだけとなり、例えばレイアウトを切り替え式にしても 2 ペイン同時表示式にしてもそのまま使えます。

1

追加

2024/02/25 11:08

投稿

jimbe
jimbe

スコア13045

test CHANGED
@@ -1,5 +1,6 @@
1
1
  以前の質問 [android room に関するエラー](https://teratail.com/questions/uvkoxkqhp3qe8u) の回答に 私の GitHub のご案内をしましたが、そのコードは既に ViewModel と LiveData を用いて MonthFragment で選択した日のデータを DateFragment に表示するようにしてあります。
2
2
  コンバータの形式を一応 SQLite 形式にし、日毎のデータを所得する SELECT は DAO ( の getAllWithinRange メソッド) に書いています。
3
+ 日付が選択されるとその日の開始日時と翌日の開始日時を求めて getAllWithinRange メソッドを呼んでいます。
3
4
  ```java
4
5
  public class Converters {
5
6
  private static final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); //SQLite datetime 風?
@@ -28,3 +29,10 @@
28
29
  LiveData<List<TimeTableEntity>> getAllWithinRange(LocalDateTime start, LocalDateTime endExclusive);
29
30
  }
30
31
  ```
32
+ 日付が選択されて LocalDate date に入っている場合の取得
33
+ ```java
34
+ LocalDateTime start = date.atStartOfDay();
35
+ LocalDateTime endExclusive = start.plusDays(1);
36
+ TimeTableDao timeTableDao = appDatabase.getTimeTableDao();
37
+ return timeTableDao.getAllWithinRange(start, endExclusive);
38
+ ```