Y&S SoftWareのホームページ
使いかってのいいソフトウェアを開発します
新着記事
コルーチンの世界
suspend fun とは
DataStore の使い方
Composeでの、【key】 の意味・使いどころ・なぜ効くのか
Room で @Query に suspend をつける理由
collectAsState() は LazyColumn の中では呼ぶ事が出来ない
StateFlowについて
StateFlow と mutableStateOf どちらを使うべきか
Android 開発でのContext とは?
UIでDataStoreを利用する
LaunchedEffect
data class とは
コルーチン (coroutine)
仮想フォルダ
Navigation Compose
Kotlin 標準クラス・メソッド一覧
Jetpack Compose 画面の上下左右からドロワーを出す シート系 UI
Jetpack Compose ドロワー関連の @Composable 関数
Jetpack Compose よく使う @Composable 関数
Kotlin 標準・便利関数リスト
Android Studio で 緑色で表示される文字
Jetpack Compose で定義される @Composable 関数
KSP プラグインでの注意点
Hello Android
Android のコード作成方法
SQLite;CREATE TABLE
SQLiteは勝手にIDを作らない
プロジェクト名の変更
先読みの正規表現について
Public Property
文字列補間(String Interpolation)と呼ばれる構文
発想の転換 「引き算を足し算に変えられないか?」
.CheckOnClick とは何か?
字幕の合成ソフト MixSrt
文字起こしソフトの開発 自己パソコン完結で高性能な文字起こしを
YS Transcriber 使用説明
文字起こしソフト YS Transcriber
カテゴリ別
ソフトウェア (9)
開発 (22)
etc (6)
以前の記事
2025年9月 (7)
2025年8月 (20)
2025年7月 (10)
使用説明
YS Transcriber 使用説明
関連サイト
元ベクターでのサイト(移転)
Y&Sせどりクラブ
連絡先
Y&S Software
DataStore の使い方
DataStore の使い方について
@
JSON 文字列にまとめて保存する方式
val getLastOpenFileMap: Flow
> = context.dataStore.data
.map { preferences ->
val json = preferences[LAST_OPEN_FILE_MAP] ?: "{}"
Gson().fromJson(json, type)
}
suspend fun saveLastOpenFile(folderId: Int, fileId: Int) {
context.dataStore.edit { preferences ->
val currentJson = preferences[LAST_OPEN_FILE_MAP] ?: "{}"
val currentMap = Gson().fromJson(currentJson, type) ?: mutableMapOf()
currentMap[folderId] = fileId
preferences[LAST_OPEN_FILE_MAP] = Gson().toJson(currentMap)
}
}
特徴
Map
を JSON にして 1 つのキーにまとめて保存
保存・取得のたびに Gson で シリアライズ/デシリアライズ が必要
データ構造を自由に作れる(Map, List, ネスト構造など)
メリット
複数のデータを 一括で管理 できる
「folderId → fileId」みたいな 関連づけが必要な場合に便利
データ形式を変えても 1 キーで済む
デメリット
JSON のパース処理が必要(オーバーヘッドあり)
更新時は 全体を再シリアライズして書き戻す必要あり
一部だけ更新したい場合でも全体を扱うので冗長
A
PreferencesKey を個別に作って保存する方式
object ScrollKeys {
fun keyForFile(fileId: Int) = intPreferencesKey("scroll_position_$fileId")
}
suspend fun saveScrollPosition(fileId: Int, position: Int) {
context.dataStore.edit { prefs ->
prefs[ScrollKeys.keyForFile(fileId)] = position
}
}
suspend fun getScrollPosition(fileId: Int): Int? {
val prefs = context.dataStore.data.first()
return prefs[ScrollKeys.keyForFile(fileId)]
}
特徴
fileId ごとに 専用のキーを作成 (scroll_position_123 みたいに)
値はプリミティブ(Int, Boolean, String…)のみ
JSON 変換不要 → 直接保存・取得
メリット
実装がシンプルで効率的(パース不要)
個別の値を直接更新できる(Map 全体を再保存する必要なし)
DataStore の思想に近い使い方
デメリット
キーが多くなる(ファイル数が多いと "scroll_position_1000" みたいに増える)
「まとめて全部のスクロール位置を取りたい」ときにやや不便
複雑な構造には向かない
どちらを選ぶのか
単純に「ファイルごとのスクロール位置」を保存したい → A(個別キー方式)が最適
軽量・高速・シンプル
「フォルダID → 最後に開いたファイルID」のように関係を管理したい → @(JSON 方式)が向いている
Map で保存して一括管理できる
まとめ
@ JSON 方式 = 複雑なデータ構造をまとめたいとき(Map, List など)
A 個別キー方式 = シンプルに「ID → 値」を直接保存したいとき