StudyLog 学習記録アプリのホーム画面

StudyLog – 「何を・どれだけ」勉強したかを可視化するログアプリ

教科・内容・時間・日付を、ワンタップで記録できるシンプルな学習ログアプリです。 「今日は数学を何分やった?」を感覚ではなくデータで管理し、 日・週・月単位で学習量を振り返れるようにすることを目標に開発しました。

作品の説明

StudyLog は、紙のノートやスプレッドシートでやりがちな 「勉強記録」をスマホに集約したアプリです。 教科を選び、学習時間とメモを入力するだけで、 その日のログがタイムラインに積み上がっていきます。

データは Room データベースに保存され、 教科別の合計時間や、日毎の合計学習時間をクエリで集計できます。 将来的には、Rootine や EEG 実験で使う集中度データと同期させて、 「どの時間帯・どの教科で集中できていたか」を一体的に見られる基盤として設計しました。

  • ① 「教科」「内容」「学習時間」「日付」を入力
  • ② Room データベースに1レコードとして保存
  • ③ 日別・週別の一覧画面で学習ログを閲覧
  • ④ 教科ごとの総学習時間を集計して表示
  • ⑤ 期間を指定して学習量を絞り込み(テスト直前など)
  • ⑥ 将来的に CSV やクラウドへのエクスポートも視野に入れて設計

システム概要

StudyLogのアーキテクチャ構成図

典型的な Android アーキテクチャ(UI → ViewModel → Repository → Room)を採用し、 将来的にグラフ表示やクラウド同期が追加しやすい構成にしています。 ログは 1 行 1 セッションで保存し、日付・教科で柔軟にクエリできるようにしました。

技術スタック

  • Android / App: Kotlin, Jetpack Compose or XML, ViewModel, LiveData / Flow
  • Persistence: Room Database(学習ログの永続化)
  • Architecture: MVVM, Repository パターン

主要コンポーネント

  • StudyLogEntity: 教科名・メモ・学習時間(分)・日付・作成時刻などを持つエンティティ。
  • StudyLogDao: insert / update / delete に加え、 日付範囲・教科別の合計時間を返すクエリを定義。
  • StudyLogRepository: ViewModel からの要求を受けて DAO を呼び出す中間レイヤ。
  • HomeViewModel: 今日の合計学習時間・教科別の時間・最新のログ一覧を UI に流す役割。
  • 入力画面: 教科選択・時間(分)・メモを入力するシンプルなフォーム。 「+ 15分」「+ 30分」などのショートカットも検討中。

技術解説

DATA MODEL

学習ログを「1セッション1行」で記録するデータモデル

StudyLog では、「1回の勉強」を 1 行のレコードとして保存しています。 日付ごとの合計時間だけでなく、内容や教科ごとに集計できるよう、 最初から「後でどう分析したいか」を意識してスキーマを設計しました。

例:
@Entity(tableName = "study_logs")
data class StudyLogEntity(
  @PrimaryKey(autoGenerate = true) val id: Long = 0,
  val subject: String,
  val minutes: Int,
  val memo: String?,
  val date: LocalDate,
  val createdAt: Instant
)
ROOM / FLOW

Room × Flow で「リアルタイムに変わる学習時間」を表示

DAO では Flow<List<StudyLogEntity>> を返すクエリを定義し、 新しいログが追加された瞬間に UI の合計時間・一覧が更新されるようにしています。 これにより、「入力したのに画面が変わらない」ストレスをなくしました。

DAO イメージ:
@Query("SELECT * FROM study_logs WHERE date = :date ORDER BY createdAt DESC")
fun logsOf(date: LocalDate): Flow<List<StudyLogEntity>>
AGGREGATION

教科別・日別の学習時間を SQL で直接集計

「今週は数学を何分やった?」「英語と数学どちらに時間を使っている?」 という問いにすぐ答えられるよう、 合計時間を返すクエリをあらかじめ用意しています。 プログラム側でループするのではなく、SQL に集計を任せています。

例:
@Query("""
SELECT subject, SUM(minutes) as totalMinutes
FROM study_logs
WHERE date BETWEEN :from AND :to
GROUP BY subject
ORDER BY totalMinutes DESC
""")
fun totalMinutesBySubject(from: LocalDate, to: LocalDate): Flow<List<SubjectTotal>>
UI / FUTURE

将来の「集中度 × 学習量」可視化に向けた土台

今はシンプルなリストと合計時間表示ですが、 将来的には Rootine や EEG 実験のデータと結びつけて、 「どのタスクで最も集中できていたか」「何時間で集中が切れるか」を 数理的に分析するための基盤として位置づけています。

実験・結果・課題

1週間分の学習ログを取ってみた結果

実際に自分の勉強を 1 週間記録してみると、 体感以上に「数学に寄っている日」「英語に偏っている日」があることがわかりました。 タイムラインで見るだけでも、自分の癖がかなり浮き彫りになります。

StudyLogの日別学習ログ一覧画面
(a) 日別のログ一覧
StudyLogの教科別集計サマリ画面
(b) 教科別の合計時間サマリ

現在の課題

現状の StudyLog は、「記録」と「ざっくりした集計」まではできますが、 グラフやカレンダー、目標時間との比較などはまだ実装途中です。 また、バックアップや別端末への引き継ぎも今後の課題です。

グラフ・カレンダーUIは未実装 バックアップ・エクスポート機能を検討中

動画リンク

ログの追加から、一覧への反映、教科別集計の変化までを 一連で撮影したデモ動画です。

StudyLog で学習ログを追加・確認する様子

まだできていない部分と今後

「学習量 × 集中度 × 目標」のハブアプリへ

StudyLog は、単なる勉強時間の記録アプリではなく、 将来的には Rootine や EEG 実験、TOEIC・HSK の学習計画と連携する 「学習データのハブ」にしていきたいと考えています。

  • 短期: グラフ表示・カレンダー表示の実装。
  • 中期: タスク管理アプリ(Rootine)との連携、 「予定どおり勉強できたか」を記録。
  • 長期: EEG の集中度データと合成し、 「自分が最も伸びる学び方」を見つけるための分析基盤に発展。

これからの改善点と開発計画

UIの改善・可視化・他ツールとの連携の3ステップで進めます。

  • UI: 入力の手間を減らすショートカットボタン・テンプレート。
  • Visualization: 日/週/月のグラフ・教科比率のドーナツチャート。
  • Integration: Obsidian / CSV / Google Drive へのエクスポート。
17
18
19
20
21
22
23
24
25
26
27
28
29
30
入力UIの改善・ショートカット追加
グラフ・カレンダー可視化の実装
Rootine / EEG との連携設計

このプロジェクトを通して

感じていること

StudyLog を作る中で、「データとして学習を扱う」ことの面白さを強く感じました。 ただ勉強するだけでなく、それをログに残し、後から自分の戦い方を分析できると、 学習が少しゲームのように感じられます。

まだ UI も機能もシンプルですが、 ここで作ったデータモデルと Room の経験は、 その後の Rootine や EEG プロジェクトの土台になっています。 「まずはきちんと記録する」ことの大切さを、 アプリを自分で使いながら実感しているところです。

今の自分へのメモ

  • ・ログを付けるだけで満足せず、必ず「振り返り」の時間をセットで確保する。
  • ・将来の分析で使えるよう、極力情報を落とさずに記録する。

リファレンス & リンク

リファレンス

  • Android Developers – Room persistence library
  • Android Architecture Components(ViewModel / LiveData / Flow)

リンク