回答編集履歴
5
追加
answer
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
|
-
これにより、 MonthFragment も DateFragment もお互いを知らず、ただ ViewModel に設定するだけ /ViewModel からデータを貰って表示するだけとなり、例えばレイアウトを切り替え式にしても 2 ペイン同時表示式にしてもそのまま使えます。(画面がある程度広ければ 2 ペインになるようにしてあります。)
|
26
|
+
これにより、 MonthFragment も DateFragment もお互いを知らず、ただ ViewModel に設定するだけ /ViewModel からデータを貰って表示するだけとなり、例えばレイアウトを切り替え式にしても 2 ペイン同時表示式にしてもそのまま使えます。(画面がある程度広ければ 2 ペインになるようにしてあります。)
|
27
|
+
|
28
|
+
---
|
29
|
+
>一度このアプリを完成させた後に、リファクタリングの過程で取り入れていきたい
|
30
|
+
|
31
|
+
使い慣れないものはとりあえず使わないで進めたいというのはとても分かります(^^;
|
32
|
+
ですが『業務で』という話になると、自分一人で好きに書くだけでは済みません。開発は大抵チームですので、使うにしろ使わないにしろそれなりの理由を持ってチームで決め、それに従う必要があります。
|
33
|
+
「理解に時間がかかるタイプ」として、もし使うことになったらその"時間"があるでしょうか。
|
4
微編集
answer
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 に表示するようにしてあります。
|
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
|
-
|
19
|
+
1. MonthFragment: 日付を選択すると MainViewModel にセット
|
20
|
+
2. MainViewModel: 日付の更新を感知してデータベースに SELECT を発行
|
21
|
+
3. Room: データベースは別スレッドで SELECT を実行し、結果を予め返していた LiveData に設定
|
24
|
-
|
22
|
+
4. MainViewModel: LiveData の設定更新を受けて結果を読み、 DateFragment が表示するデータを更新
|
23
|
+
5. DateFragment: データの更新を受けてアダプタが読み、表示を更新
|
24
|
+
となります。
|
25
25
|
|
26
|
-
|
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
全体編集
answer
CHANGED
@@ -1,21 +1,19 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
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
|
-
|
8
|
+
LocalDateTime start = date.atStartOfDay();
|
9
|
+
LocalDateTime endExclusive = start.plusDays(1);
|
10
|
+
TimeTableDao timeTableDao = appDatabase.getTimeTableDao();
|
6
|
-
|
11
|
+
List<TimeTableEntity> list = timeTableDao.getAllWithinRange(start, endExclusive);
|
12
|
+
```
|
13
|
+
でその日のデータが取れます。
|
7
14
|
|
8
|
-
|
9
|
-
|
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
|
-
日付
|
33
|
-
|
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
追加
answer
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
|
@@ -35,4 +35,6 @@
|
|
35
35
|
LocalDateTime endExclusive = start.plusDays(1);
|
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
追加
answer
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 風?
|
@@ -27,4 +28,11 @@
|
|
27
28
|
@Query("SELECT * FROM TimeTable WHERE :start <= datetime AND datetime < :endExclusive ORDER BY datetime")
|
28
29
|
LiveData<List<TimeTableEntity>> getAllWithinRange(LocalDateTime start, LocalDateTime endExclusive);
|
29
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);
|
30
38
|
```
|